Elasticsearch 标签匹配个数优先排序查询 | 优化搜索结果排序

Elasticsearch 优化搜索结果排序

在某些相似度匹配需求中,我们可能需要根据匹配到的标签个数优先对搜索结果进行排序。为了满足这种需求,我们可以使用Elasticsearch自定义查询语句来实现。

首先,让我们一起看一下具体的代码实现。以下示例使用PHP数组结构,最终会将其转换为JSON格式进行提交。

'query' => [
    'script_score' => [
        "query"  => [],
        'script' => [
            'source' => '
                        def matches = 0;
                        for (t in params.tags) {
                            if(doc["tags"].contains(t)) {
                                matches += 1;
                            }
                        }
                        return _score * matches * matches;
                        ',
            "params" => [
                "tags" => $tags,
            ],
        ]
    ],
]

以上代码中的 query 是通常写在请求的 body 中的查询语句,重点关注内部的 script_score 部分:

  • script_score 包含两个部分:query 和自定义的 script

  • query 部分与正常的查询结构相同,在外层的 query 中可以继续使用其他查询方式,例如标签匹配等。

  • script 部分又包含两个子项:

    • source:自定义的评分排序脚本

    • params:自定义的评分脚本参数

让我们更详细地解析其中的内容。

首先是 params 部分,我们传递了一个标签数组 $tags,这个参数将在 source 中被调用。source 会在 Elasticsearch 中进行编译,形成类似于函数的结构,并使用 params.tags 来调用传递的标签参数。

接下来,我们来看一下 source 部分的代码实现。在这里,我们通过比较搜索结果文档(doc)中的 tags 字段(也是一个数组)与期望的标签进行校验和对比,最终得到实际匹配的个数 matches。

在 return 语句中,我们返回评分结果。_score 是 Elasticsearch 计算出的相似度评分,而 _score * matches * matches 则是将标签个数匹配结果进行放大处理,标签数匹配越多,放大结果越大。

举个例子来说明:

匹配文档_score标签个数结果分排序位置
文档A4021602
文档B3032701

从上面的例子可以看出,最终结果受到标签影响更大,实现了按照标签个数优先排序的效果。

当然,具体的放大形式可以根据实际情况进行处理。例如,如果评分相同,可以直接按照标签个数优先排序,而无需进行标签平方处理。根据实际需求,你可以自行调整放大结果的计算方式。

通过使用Elasticsearch中的自定义查询语句和评分脚本,我们能够实现按照标签匹配个数优先对搜索结果进行排序,从而提高搜索结果的准确性和相关性。这种技术在许多场景下都非常有用,例如电商网站的商品搜索、新闻文章的相关推荐等。

除了上述示例中使用的PHP代码外,你还可以使用其他编程语言来实现类似的功能。Elasticsearch支持多种客户端库,例如Java、Python等,你可以根据自己的需求选择适合的客户端进行开发。

在实际应用中,你可以根据具体情况对查询语句进行优化和定制,以获得更好的搜索体验。以下是一些建议:

  1. 确保标签字段被正确地建立索引:Elasticsearch的性能取决于正确的索引设置。对于标签字段,你应该选择适当的分词器和索引方式,以便准确匹配和排序。

  2. 考虑缓存机制:如果你的标签数据相对稳定,并且查询频率较高,可以考虑使用缓存机制来提高查询性能。将查询结果缓存在内存或者分布式缓存中,只有在标签数据发生变化时才更新缓存。

  3. 使用倒排索引优化查询效率:倒排索引是Elasticsearch的核心功能之一,它通过将文档中的每个单词映射到包含该单词的文档列表中,从而加快搜索速度。你可以通过调整索引设置和查询结构来优化倒排索引的效率。

  4. 了解Elasticsearch的相关功能和特性:Elasticsearch提供了许多强大的功能和特性,例如聚合、过滤器、模糊匹配等。深入了解这些功能,并根据实际需求进行使用,可以进一步提升搜索结果的质量和排序准确性。

总结

通过自定义查询语句和评分脚本,我们可以在Elasticsearch中实现按照标签匹配个数优先排序的需求。这种技术可以帮助我们提高搜索结果的准确性和相关性,为用户提供更好的搜索体验。在实际应用中,我们还可以根据具体情况进行优化和定制,以满足不同场景下的需求。希望本文能对你理解并应用Elasticsearch的自定义查询语句提供帮助!


文章来源地址https://www.toymoban.com/article/610.html

到此这篇关于Elasticsearch 标签匹配个数优先排序查询 | 优化搜索结果排序的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/article/610.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

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

相关文章

  • Elasticsearch7.8.0版本入门—— 完全匹配查询文档(高级查询)

    Elasticsearch7.8.0版本入门—— 完全匹配查询文档(高级查询)

    在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 1 ,请求体内容为: 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 2 ,请求体内容为: 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/ 3 ,请求体内容为: 在 Postman 中,向

    2023年04月24日
    浏览(11)
  • Elasticsearch(十一)搜索---搜索匹配功能②--range查询和exists查询

    Elasticsearch(十一)搜索---搜索匹配功能②--range查询和exists查询

    继上一节学习了ES的搜索的查询全部和term搜索后,此节将把搜索匹配功能剩余的2个学习完,分别是range搜索和exists搜索 range查询用于范围查询,一般是对数值型和日期型数据的查询。使用range进行范围查询时,用户可以按照需求中是否包含边界数值进行选项设置,可供组合的

    2024年02月09日
    浏览(9)
  • Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理

    Elasticsearch(十二)搜索---搜索匹配功能③--布尔查询及filter查询原理

    本节主要学习ES匹配查询中的布尔查询以及布尔查询中比较特殊的filter查询及其原理。 复合搜索,顾名思义是一种在一个搜索语句中包含一种或多种搜索子句的搜索。 布尔查询是常用的复合查询,它把多个子查询组合成一个布尔表达式,这些子查询之间的逻辑关系是\\\"与\\\",即

    2024年02月04日
    浏览(8)
  • Elasticsearch从入门到精通-05ES匹配查询

    Elasticsearch从入门到精通-05ES匹配查询

    👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES各种场景下的匹配查询,有助于我们在项目中进行综合使用 创建索引并指定ik分词器: 添加数据: 需要搜索的document中的remark字段包含java和developer词组 上述语法中,如果将operator的值改为or。则与

    2024年03月27日
    浏览(7)
  • Elasticsearch(十)搜索---搜索匹配功能①--查询所有文档和term级别查询

    Elasticsearch(十)搜索---搜索匹配功能①--查询所有文档和term级别查询

    之前的学习我们已经了解了搜索的辅助功能,从这一章开始就是ES真正核心的功能,搜索。针对不同的数据类型,ES提供了很多搜索匹配功能:既有进行完全匹配的term搜索,也有按照范围匹配的range搜索;既有进行分词匹配的match搜索,也有按照前缀匹配的suggesr搜索。我们同样

    2024年02月11日
    浏览(6)
  • Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

    Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

    之前我们学习了布尔查询,知道了filter查询只在乎查询条件和文档的匹配程度,但不会根据匹配程度对文档进行打分,而对于must、should这两个布尔查询会对文档进行打分,那如果我想在查询的时候同时不去在乎文档的打分(对搜索结果的排序),只想过滤文本字段是否包含这

    2024年02月11日
    浏览(8)
  • Java查询es数据,根据指定id检索(in查询),sql权限过滤,多字段匹配检索,数据排序

    Java集成Elasticsearch,进行索引数据查询,并进行sql权限过滤,指定id检索(in查询),多字段匹配检索,数据排序。由于权限过滤是根据sql语句判断当前用户或其部门可查询的数据,所以采用以下方法: 1.通过sql过滤出当前用户可查询的数据id集合idsList; 2.将当前用户可查询的

    2024年02月22日
    浏览(10)
  • Springboot3.1+Elasticsearch8.x匹配查询

    Springboot3.1+Elasticsearch8.x匹配查询

    springboot-starter3.1.0中spring-data-elasticsearch的版本为5.1.0,之前很多方法和类都找不到了。这里主要讲讲在5.1.0版本下如何使用spring data对elesticsearch8.x进行匹配查询。 第一步当然是配置依赖 在这里面,spring-boot-starter-data-elasticsearch是3.1.0的,里面的spring-data-elasticsearch是5.1.0的,服务

    2024年02月15日
    浏览(6)
  • Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略

    Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略

    在生产使用中,Elasticsearch 除了精确匹配的要求,也会有模糊查询的场景。 面对这种问题 ,传统的解决方案有两种: 2.1 方案一:ngram 分词器 使用 ngram 分词器对存入的数据进行精细化的拆分,利用细颗粒度的 token 进行快速的召回。 这是一个利用空间换时间的方案,细化查询

    2024年02月04日
    浏览(7)
  • elasticsearch 基于ik分词器的分词查询和模糊匹配

    elasticsearch 基于ik分词器的分词查询和模糊匹配

    前言:elasticsearch 查询有很多,查询的条件有固定格式,返回结果提示不明确,让ES使用起来有点不方便的感觉,ES查询方式很多,简单介绍几种使用点的,实用的 此处简单梳理一下最常用的查询 模糊匹配查询 类似 mysql 语法中的 like ‘%value%’ 类似于百度的分词查询 将

    2024年02月16日
    浏览(5)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包