当前位置:   article > 正文

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

es根据匹配度排序

需求

匹配分、热度分归一化
排序:匹配分 * 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;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

归一化排序

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(Comparator.comparing(ProductNewSearchInfo::getEsScore))
                .orElse(new ProductNewSearchInfo().setEsScore(0F))
                .getEsScore();
        Float esMin = eSearchInfoList.stream()
                .filter(o -> ObjectUtil.isNotNull(o.getEsScore()))
                .min(Comparator.comparing(ProductNewSearchInfo::getEsScore))
                .orElse(new ProductNewSearchInfo().setEsScore(0F))
                .getEsScore();
        float esMaxSubMin = esMax - esMin;

        // 热度分
        Float productMax = eSearchInfoList.stream()
                .filter(o -> ObjectUtil.isNotNull(o.getProductScore()))
                .max(Comparator.comparing(ProductNewSearchInfo::getProductScore))
                .orElse(new ProductNewSearchInfo().setProductScore(0F))
                .getProductScore();
        Float productMin = eSearchInfoList.stream()
                .filter(o -> ObjectUtil.isNotNull(o.getProductScore()))
                .min(Comparator.comparing(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(Comparator.comparing(ProductNewSearchInfo::getSigmoidSortScore).reversed())
                .collect(Collectors.toList());
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

排序结果

[
    {
        "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"
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/750728
推荐阅读
相关标签
  

闽ICP备14008679号