Elastic Search 根据匹配分和热度分排序

编程入门 行业动态 更新时间:2024-10-20 03:28:49

Elastic Search 根据匹配分和<a href=https://www.elefans.com/category/jswz/34/1763088.html style=热度分排序"/>

Elastic Search 根据匹配分和热度分排序

需求

匹配分、热度分归一化
排序:匹配分 * 0.8 + 热度分 * 0.2

实体

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class ProductNewSearchInfo {/*** 产品唯一CODE*/private String productCode;/*** ES分(匹配分)*/@JSONField(serialize = false)private Float esScore;/*** 产品分(热门分)*/private Float productScore;/*** 归一化排序分*/@JSONField(serialize = false)private Double sigmoidSortScore;/*** 归一化排序分详情*/@JSONField(serialize = false)private String sigmoidScoreDetail;}

归一化排序

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;/*** 线性函数归一化* x = x - min / max - min** @author jason*/
@Slf4j
public class EsInfoSort {public static void main(String[] args) {List<ProductNewSearchInfo> eSearchInfoList = CollectionUtil.newArrayList(new ProductNewSearchInfo().setProductCode("4352").setEsScore(31.5223345F).setProductScore(5.54F),new ProductNewSearchInfo().setProductCode("4353").setEsScore(33.2587443F).setProductScore(8.24F),new ProductNewSearchInfo().setProductCode("4354").setEsScore(32.2387447F).setProductScore(2.34F),new ProductNewSearchInfo().setProductCode("4355").setEsScore(35.2323348F).setProductScore(6.54F),new ProductNewSearchInfo().setProductCode("4356").setEsScore(80.8578587F).setProductScore(3.74F),new ProductNewSearchInfo().setProductCode("4358").setEsScore(70.8578587F),new ProductNewSearchInfo().setProductCode("4359").setProductScore(9.2345335F),new ProductNewSearchInfo().setProductCode("4360"),new ProductNewSearchInfo().setProductCode("4361"),new ProductNewSearchInfo().setProductCode("4362"));eSearchInfoList = new EsInfoSort().sortBySigmoidScore(eSearchInfoList);log.info("归一化排序后:{}", JSONUtil.formatJsonStr(JSONUtil.toJsonStr(eSearchInfoList)));}/*** 归一化排序*/private List<ProductNewSearchInfo> sortBySigmoidScore(List<ProductNewSearchInfo> eSearchInfoList) {// 匹配分Float esMax = eSearchInfoList.stream().filter(o -> ObjectUtil.isNotNull(o.getEsScore())).max(Comparatorparing(ProductNewSearchInfo::getEsScore)).orElse(new ProductNewSearchInfo().setEsScore(0F)).getEsScore();Float esMin = eSearchInfoList.stream().filter(o -> ObjectUtil.isNotNull(o.getEsScore())).min(Comparatorparing(ProductNewSearchInfo::getEsScore)).orElse(new ProductNewSearchInfo().setEsScore(0F)).getEsScore();float esMaxSubMin = esMax - esMin;// 热度分Float productMax = eSearchInfoList.stream().filter(o -> ObjectUtil.isNotNull(o.getProductScore())).max(Comparatorparing(ProductNewSearchInfo::getProductScore)).orElse(new ProductNewSearchInfo().setProductScore(0F)).getProductScore();Float productMin = eSearchInfoList.stream().filter(o -> ObjectUtil.isNotNull(o.getProductScore())).min(Comparatorparing(ProductNewSearchInfo::getProductScore)).orElse(new ProductNewSearchInfo().setProductScore(0F)).getProductScore();float productMaxSubMin = productMax - productMin;// 排序分eSearchInfoList.forEach(item -> {Float esScore = Optional.ofNullable(item.getEsScore()).orElse(0F);Float productScore = Optional.ofNullable(item.getProductScore()).orElse(0F);float esSigmoidScore = (esScore - esMin) / esMaxSubMin;float productSigmoidScore = (productScore - productMin) / productMaxSubMin;if (Float.isNaN(esSigmoidScore)) {esSigmoidScore = 0F;}if (Float.isNaN(productSigmoidScore)) {productSigmoidScore = 0F;}item.setSigmoidScoreDetail(StrUtil.format("匹配分: {}, 热度分: {}", esSigmoidScore, productSigmoidScore));item.setSigmoidSortScore((esSigmoidScore * 0.8) + (productSigmoidScore * 0.2));});return eSearchInfoList.stream().filter(o -> ObjectUtil.isNotNull(o.getSigmoidSortScore())).sorted(Comparatorparing(ProductNewSearchInfo::getSigmoidSortScore).reversed()).collect(Collectors.toList());}}

排序结果

[{"productCode": "4356","esScore": 80.85786,"productScore": 3.74,"sigmoidSortScore": 0.8406118899583817,"sigmoidScoreDetail": "匹配分: 1.0, 热度分: 0.20305945"},{"productCode": "4358","esScore": 70.85786,"sigmoidSortScore": 0.5699651718139649,"sigmoidScoreDetail": "匹配分: 0.7973063, 热度分: -0.33939934"},{"productCode": "4353","esScore": 33.258743,"productScore": 8.24,"sigmoidSortScore": 0.19930680990219116,"sigmoidScoreDetail": "匹配分: 0.035195902, 热度分: 0.85575044"},{"productCode": "4355","esScore": 35.232334,"productScore": 6.54,"sigmoidSortScore": 0.18199512958526612,"sigmoidScoreDetail": "匹配分: 0.07519935, 热度分: 0.60917825"},{"productCode": "4352","esScore": 31.522335,"productScore": 5.54,"sigmoidSortScore": 0.09282717108726501,"sigmoidScoreDetail": "匹配分: 0.0, 热度分: 0.46413586"},{"productCode": "4354","esScore": 32.238743,"productScore": 2.34,"sigmoidSortScore": 0.011616908013820648,"sigmoidScoreDetail": "匹配分: 0.014521135, 热度分: 0.0"},{"productCode": "4359","productScore": 9.234533,"sigmoidSortScore": -0.3111503124237061,"sigmoidScoreDetail": "匹配分: -0.6389379, 热度分: 1.0"},{"productCode": "4360","sigmoidSortScore": -0.579030179977417,"sigmoidScoreDetail": "匹配分: -0.6389379, 热度分: -0.33939934"},{"productCode": "4361","sigmoidSortScore": -0.579030179977417,"sigmoidScoreDetail": "匹配分: -0.6389379, 热度分: -0.33939934"},{"productCode": "4362","sigmoidSortScore": -0.579030179977417,"sigmoidScoreDetail": "匹配分: -0.6389379, 热度分: -0.33939934"}
]

更多推荐

Elastic Search 根据匹配分和热度分排序

本文发布于:2024-03-13 12:18:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733978.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:热度   分和   Elastic   Search

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!