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

这篇具有很好参考价值的文章主要介绍了Elastic Search 根据匹配分和热度分排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

匹配分、热度分归一化
排序:匹配分 * 0.8 + 热度分 * 0.2文章来源地址https://www.toymoban.com/news/detail-568969.html

实体

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(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());
    }

}

排序结果

[
    {
        "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 根据匹配分和热度分排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分页、搜索匹配、全文搜索、搜索建议、字段排序

    原文链接:https://xiets.blog.csdn.net/article/details/132348920 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 搜索 API 官网文档:Search APIs 先创建一个索引,并写入一些文档用于搜索示例: 写入一些文档示例: 官网API:The _source option 搜索结果中的文档数据封装

    2024年02月08日
    浏览(47)
  • es--Elastic Search深度分页问题分析及四种解决方案

    ​ Elasticsearch的深度分页是指当你需要查询的结果数量非常多时,需要分页查询的第n页时,每次查询都需要扫描前n-1页的数据来获取结果。这样会导致性能问题,因为它需要很长的时间来完成查询。 Scroll API: Scroll API可以让你在每个查询阶段中存储状态。这样,你就不需要从

    2024年02月08日
    浏览(36)
  • ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案

    本文是ElasticSearch第三讲,在了解ElaticSearch之后,我们还要了解Elastic背后的生态 即我们 常说的ELK ;与此同时,还会给你展示ElasticSearch的 案例场景 ,让你在学习ES前对它有个全局的印象。 Beats + Logstash + ElasticSearch + Kibana 如下是我从官方博客中找到图,这张图展示了ELK生态以

    2024年02月07日
    浏览(35)
  • Elasticsearch ES 简单查询 Query String Search 入门

    尝试了text类型排序需要特别处理下. \\\"reason\\\" : \\\"Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index.

    2024年02月16日
    浏览(42)
  • 【elastic search】JAVA操作elastic search

    目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 本文是作者ES系列的第三篇文章,关于ES的核心概念移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 关于ES的下载安装教程以及基本使用,移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 在前文

    2024年01月25日
    浏览(44)
  • Elastic Search一些用法

    参考: 中国开源社区 官方介绍 ES 的权重排序 【Elasticsearch】ElasticSearch 7.8 多字段权重排序 ElasticSearch7.3学习(十三)----定制动态映射(dynamic mapping) 【Elasticsearch教程4】Mapping 动态映射 【Elasticsearch教程5】Mapping 动态模板 Dynamic templates 注意事项:需要先创建模板,然后添加数据

    2024年02月06日
    浏览(41)
  • elastic search入门

    参考1:Elastic Search 入门 - 知乎 参考2:Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK,省略,之前已安装过 1.2创建ES用户 1.3 下载ElasticSearch安装包 Ubuntu上下载: 然后解压: 1.4配置 配置jvm.options 配置elasticsearch.yml: 根据以上设置的path.data和path.l

    2024年01月23日
    浏览(45)
  • ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll

    01. 数据准备 ElasticSearch 向 my_index 索引中索引了 12 条文档: 02. ElasticSearch 如何查询所有文档? ElasticSearch 查询所有文档 根据查询结果可以看出,集群中总共有12个文档,hits.total.value=12, 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档? 03. ElasticSearch 如何指定搜

    2023年04月08日
    浏览(39)
  • ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

    我的Git地址:https://gitee.com/ITLULU 欢迎访问 ES的分页查询和关系数据库的分页查询的区别: ES分页查询有以下几种: 1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力) 2: scroll基于查询窗口

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包