elasticsearch[七]:ES评分规则详解[查询评分规则、自定义评分规则]

这篇具有很好参考价值的文章主要介绍了elasticsearch[七]:ES评分规则详解[查询评分规则、自定义评分规则]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

elasticsearch[七]:ES评分规则详解

一、需求

因为需要对搜索结果进行一个统一化的评分,因此需要仔细研究 ES 本身的评分规则从而想办法把评分统一。

省流:无法确切统一化

二、ES 查询评分规则

之前有说过 ES 的查询评分原理,那么仔细思考之后就会发现,长文本搜索对应的 score 会比短文本搜索的 score 高很多:score = 单个分词评分之和,长文本对应的词更多那么 score 就会更多。

通过在查询中设置参数”explain”:true 来查看具体的分数来源 (explain的输出代价较大。它只是一个调试工具。不要让在生产中使用):

2.1. 查询分数基本结构

request:

post http://localhost:9200/policy_index/_search

{
    "size": 20,
    "query": {
        "match": {
            "policyTitle": {
                "query": "青年大学习"
            }
        }
    },
    "explain": true
}

response:

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

可以看到结果集中的一条结果 explanation 中就是评分的具体信息:

score(总分)=15.48946=score_value(“青年”)+score_value(“大学”)

policyTitle 本身存入时和查询时使用的都是 ik_max_word 分词器 (不单独指定 search_analyzer 即查询默认使用 analyzer 对应的分词器),为细粒度划分,“青年大学习” 被拆分为多个 (可以通过切换分词器或自定义专业词库的形式避免,这里仅做评分解析就不管了)

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

上面的查询结果中被拆分为青年 + 大学,根据分词结果,青年 + 学习也是可以被检索到的 (三者都有也行):

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

即查询请求会根据分词器在 ES 内部被重写为以下结构:

"bool": {
      "should": [
        {"term": { "policyTitle": "青年" }},
        {"term": { "policyTitle": "大学" }},
        {"term": { "policyTitle": "学习" }}
      ]
    }
}

2.2. 单独分词分数

参考:

博客:https://www.cnblogs.com/wangchuanfu/p/7452809.html

官方文档:https://www.elastic.co/guide/en/elasticsearch/guide/master/relevance-intro.html

https://www.elastic.co/guide/en/elasticsearch/guide/master/scoring-theory.html

单独查看第一篇文档中” 青年” 的得分:9.51721

score(freq=2.0), computed as boost * idf * tf from:

即 score=boost * idf * tf

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

具体参数:

(一)TF/IDF 评分模型

(1)tf-- 频率

该术语在本文档中出现的频率如何?次数越多,分数越高

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

如果您不关心术语在字段中出现的频率,而您只关心该术语是否存在,那么您可以在字段映射中禁用术语频率:

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

(2)idf-- 逆文档频率

该术语在集合中的所有文档中出现的频率是多少?次数越多,分数越低

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

(二) 向量空间评分模型

具体见官网:https://www.elastic.co/guide/en/elasticsearch/guide/master/scoring-theory.html#vector-space-model

介绍:

向量空间模型提供了一种将多项查询与文档进行比较的方法。输出是一个单一的分数,表示文档与查询的匹配程度。为了做到这一点,模型将文档和查询都表示为向量。

向量实际上只是一个包含数字的一维数组,例如:

[1,2,5,22,3,8]

在向量空间模型中,向量中的每个数字都是一个词的权重,用词频 / 逆文档频率计算 (词语越稀有,权重越大)。

(虽然 TF/IDF 是计算向量空间模型项权重的默认方法,但它不是唯一的方法。其他模型如 Okapi-BM25 存在并且在 Elasticsearch 中可用。TF/IDF 是默认值,因为它是一种简单、高效的算法,可以产生高质量的搜索结果,并且经受住了时间的考验。)

待匹配内容会根据数组向量形成一条线,而文档中与其匹配的内容也会形成对应的线,那么线越靠近就说明结果越匹配。

(三) 实用评分函数

对于多项查询,Lucene 采用布尔模型、 TF/IDF 和向量空间模型,并将它们组合在一个高效的包中,一旦文档与查询匹配,Lucene 就会计算该查询的分数,并结合每个匹配项的分数。用于评分的公式称为实用评分函数。

score(q,d)  =  
            queryNorm(q)  
          · coord(q,d)    
          · ∑ (           
                tf(t in d)   
              · idf(t)²      
              · t.getBoost() 
              · norm(t,d)    
            ) (t in q)  
 
1.queryNorm--查询规范化因子
是对查询进行规范化的一种尝试,以便可以将一个查询的结果与另一个查询的结果进行比较。
尽管查询规范的目的是使不同查询的结果具有可比性,但效果并不理想。相关性_score的唯一目的是按照正确的顺序对当前查询的结果进行排序。您不应该尝试比较来自不同查询的相关性分数。
每个文档的查询规范化因子相同,无法更改。
 
2.coord--协调因子
用于奖励包含较高百分比查询词的文档。文档中出现的查询词越多,文档与查询匹配的可能性就越大,分数越高。
也就是同时包含“青年”“大学”“学习”的文档的分数不仅仅是三者相加的分数,而是会使用协调因子将分数乘以文档中匹配项的数量,然后除以查询中的项总数。
 
3.tf--词频
 
4.idf--逆文档频率
 
5.t.getBoost()--查询提升
用于增加查询中某个字段的重要性:https://www.elastic.co/guide/en/elasticsearch/guide/master/query-time-boosting.html
 
6.norm--场长范数
字段有多长?字段越短,权重越高。
如果一个术语出现在一个短字段中,那么与同一个术语出现在一个更大的字段中相比,认为更匹配,分数更高。

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

  • 总结

查询分数 = 分词分数之和

分词分数 = boost 提升 * tf 词语出现频率 * idf 词语在所有文档的此字段中出现频率,其他的参数根据需求设定

三、ES 自定义评分规则

即 function_score,这个之前有比较详细的讲解,更具体的案例应用和参数讲解见官网:https://www.elastic.co/guide/en/elasticsearch/guide/master/function-score-query.html

在我的案例中使用的是在 policyTitle+textContent 中查询词语,并根据省份 + 分类得到一个比例与查询分数进行相乘的形式来计算 score,发送 query 请求并 explain 查看是否符合我们设定的需求:

总分:39.185825

  1. 查询得分:10.312058

由词语在 policyTitle 和 textContent 中的分数之和组成,正常√

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

  1. 自定义得分:3.8000002

由 script_score 和衰减函数 linear 的得分 2.8+1 组成,正常√

其中 script_score 由分类决定,如果分类与用户的用户画像分类匹配,返回指定权重的分数,用户画像由类似

{金融贸易 = 0.70000005, 医疗健康 = 0.1, 其他 = 0.1, 工业 = 0.1} 形式构成,说明用户常看金融类,那么金融类的得分会更高。

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

总分 = 查询得分 * 自定义得分,正常√,这样就会让符合条件的文档分数大幅提高

  1. 测试

上面查询的是一个没有特别属性的中义词,会返回令人满意的结果,下面搜索一些具有特殊省份、分类的词语,观察 function_score 是否会因为设定的省份和分类而极大影响,导致返回不合理的结果。

(1) 特殊省份

根据分类判断,正常√

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

(2) 特殊分类

这里发现省份和分类的影响还是很大的

除非查询本身的分数很高,否则会更倾向于符合 function 中分类和省份的结果。。

搜索:工业废水

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

(3) 特殊省份 + 特殊分类

这里体现的更明显,由于省份分数为 0/1,在查询时甚至完全忽略省份,完全由分类决定

搜索:北京工业废水

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

考虑控制分类的返回值不超过 1.5,尽管用户可能在某一个分类中经常浏览,但是为了避免搜素结果过多的由分类决定而导致查询的结果不理想,于是进行一定的权重控制。控制不匹配分类等的最低返回值为 1,这样即使分类、省份都不匹配,如果查询得分很高依然不会受到太大影响,不至于让用户完全无法看到这样的结果。

这样一来,保证 function 无论如何在 1-2.5 之间。(考虑通过衰减因子改变省份的值,例如不再是 0/1,而是 0/0.5,从而减小省份的影响,形成 1-2 的 function 分数 – 最终选择的方案)

(4) 修改后再次查询

①特殊分类:工业废水

文档相关性占比很大,分类和省份占比 (1-2)

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

②特殊省份 + 特殊分类:北京工业废水

这里发现由于在文档中查询 “北京工业废水”,由于查询分数不会专注于“北京”,因此往往会按照“工业废水” 的高评分 * 自定义评分来得到高分,暂时想到的解决是:

  1. 如果涉及特殊省份的查询,引导用户自己单独选中侧边栏的省份选项后再查询 (告知用户这样搜索效果更好)

  2. 去除 TF 词频的影响,即不在意词语在文档中出现了多少次,只在意是否出现,那么就可以比较好的保证文档中能出现大部分的搜索语句,但是这个就涉及到用户希望出现的结果是什么样的,需要考虑。

elasticsearch 100分打分策略,Elastic search,elasticsearch,大数据,搜索引擎,全文检索,NLP,RAG,人工智能

四、总结

总之,score = 查询得分 (分词得分之和) 与自定义得分综合计算的结果,其中查询得分涉及比较多,不太好改,而且考虑到查询结果对不同用户的得分观感都是不一样的,不可能用匹配度之类的确切结果进行描述,于是选择以排名第一的结果为 100 分,将分数称为 “推荐指数” 等形式的主观词汇,当然后续根据用户体验还会尝试修改,目前想到的解决方案就是这样了。

参考链接:
https://blog.csdn.net/qq_51641196/article/details/130073774?spm=1001.2014.3001.5502文章来源地址https://www.toymoban.com/news/detail-808147.html

到了这里,关于elasticsearch[七]:ES评分规则详解[查询评分规则、自定义评分规则]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 关于ES中Function_Score在自定义打分中的应用

    现在有许多商品需要在商品列表中进行排序展示,排序要求使用ES并且尽量一次性查出来,有要求如下: 重点商品,收藏商品,优质商品,普通商品的顺序展出 在同一类商品发生冲突时,按照自主产品,非自主产品进行展出(是否自主产品是一个集合,只有集合里面有7才属于

    2024年02月10日
    浏览(43)
  • ES 自定义评分实现结果集排序问题

    需求是根据短句查询后,不分词全包含(类似mysql的like)的语句要在最上边,其次是分词后的数据全包含的排在后边,然后是包含部分分词的数据,最后这三类数据要根据时间倒叙,自带的评分机制无法满足需求,所以使用function_score 自定义结果的评分: 用到了ik分词器 由于

    2024年02月13日
    浏览(43)
  • 表单考勤签到作业周期打卡打分评价评分小程序开源版开发

    表单考勤签到作业周期打卡打分评价评分小程序开源版开发 表单打卡评分 表单签到功能:学生可以通过扫描二维码或输入签到码进行签到,方便教师进行考勤管理。 考勤功能:可以记录学生的出勤情况,并自动生成出勤率和缺勤次数等统计数据,帮助教师及时掌握课堂出勤

    2024年01月18日
    浏览(44)
  • ElasticSearch自定义评分-看这篇就够了

    文章目录   一、适用的场景    1.基本介绍    2.使用场景     2.1根据价格评分排序     2.2根据距离评分排序     2.3根据距离价格综合评分排序     2.4自定义编写脚本   二、常用的字段解释    1.整体结构    2.function_score     2.1.qu

    2024年02月06日
    浏览(44)
  • ElasticSearch第十一讲 ES检索评分score以及分数计算逻辑

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度。Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 Term frequency:搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关

    2023年04月23日
    浏览(39)
  • es。模糊查询的查询规则

    2024年02月15日
    浏览(42)
  • ElasticSearch[八]:自定义评分功能、使用场景讲解以及 function_score常用的字段解释

    基本介绍 ES 的使用中,ES 会对我们匹配文档进行相关度评分。但对于一些定制化的场景,默认评分规则满足不了我们的要求。这些定制化场景,ES 也是推出了自定义评分方式来进行支持。可以使用 ES 提供的一些函数,什么可以使用较分来让我们的评分规则多样化。我举个大

    2024年01月24日
    浏览(41)
  • es elasticsearch 十四 各种机制 评分机制 正序索引 解决跳跃结果问题 解决耗时过长问题 解决相同属性值都到一个地方

    目录 评分机制 机制 查看评分实现如何算出来的explain=true 分析能否被搜索到 Doc value 正排序索引 Query phase Fetch phase Preference 问题 解决跳跃结果问题 Timeout 到达时间直接返回,解决耗时过长问题 Routing 数据准确分配到某地,解决相同属性值都到一个地方 评分机制 机制 TF分词频

    2024年02月08日
    浏览(76)
  • Elasticsearch不规则多边形区域查询

    定义ES连接类 其中self.es = Elasticsearch(hosts=self.host.split(‘,’), port=self.port)中,hosts参数接收的是一个字符串列表,例如[‘192.168.16.96’,‘192.168.16.97’,‘192.168.16.98’]等,端口是9200 创建一个带有geo_shape字段类型的索引。(仅执行一次) 插入一条数据以后 可以利用 来检查location字

    2024年02月12日
    浏览(48)
  • Elasticsearch:使用查询规则(query rules)进行搜索

    在之前的文章 “Elasticsearch 8.10 中引入查询规则 - query rules”,我们详述了如何使用 query rules 来进行搜索。这个交互式笔记本将向你介绍如何使用官方 Elasticsearch Python 客户端来使用查询规则。 你将使用 query rules API 将查询规则存储在 Elasticsearch 中,并使用 rule_query 查询它们。

    2024年02月21日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包