《深入理解ElasticSearch》——2.3 二次评分

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来自华章计算机《深入理解ElasticSearch》一书中的第2章,第2.3节,作者:[美] 拉斐尔·酷奇(Rafa Ku) 马雷克·罗戈任斯基(Marek Rogoziński)更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3 二次评分

有的时候,改变查询返回文档的顺序是很有好处的。这么做的理由有很多,其中之一便是出于对性能的考虑,例如,在整个文档集上计算文档顺序是非常耗时的,而在原始查询的返回文档的子集上做这种计算则非常省事。你可以想象一下,二次评分给了用户很多机会来定制业务逻辑。现在,让我们来看看这个功能,以及它能带给我们哪些便利。
2.3.1 理解二次评分
ElasticSearch中的二次评分指的是重新计算查询返回文档中指定个数文档的得分。这意味着ElasticSearch会截取查询返回文档的前N个,并使用预定义的二次评分方法来重新计算它们的得分。
2.3.2 范例数据
我们的范例数据保存在documents.json文件中(本书提供了这些代码),并可用以下命令添加到索引中:


246105476d2e8f9334224d5d5c4390cc2a8124c6

2.3.3 查询
让我们从下面这个简单查询入手:


19ce66b8d4897de776d1197b2a19490eb7991806

执行该查询将返回索引中的所有文档。因为使用了match_all查询类型,所以每个返回文档的得分都等于1.0,这充分体现了二次评分对查询返回文档集的影响。值得一提的是,我们在查询中指定只返回文档的title和available字段。
2.3.4 二次评分查询的结构
二次评分查询范例如下所示:


<a href=https://yqfile.alicdn.com/ac44ff89ff1b94bb9de39fc011f4abc5e6ba2816.png" >

前面的范例中,你可以在rescore对象中看到一个query对象。在本书中query只是该对象的唯一选项,但在将来的版本中可能会有其他方式来影响二次评分。因而这里的范例中,只是使用了一个简单的查询返回所有的文档,并且将每个文档的得分改写为该文档的year字段中的值(本范例只是用来演示二次评分,并没有实际意义)。
如果将该查询保存在query.json文件中,并使用下面的命令执行该查询:curl localhost: 9200/library/book/_search?pretty -d @query.json,则会看到下面这些文档(这里忽略了响应消息的结构):


dda7c932e0684ffdb509b6ae332ee5ad70750a9a


9933ab7f17f8394104d5cdf50ff8e75da111b88c

正如大家所见,ElasticSearch找到了与原始查询匹配的所有文档。现在让我们看看各个文档的得分。ElasticSearch截取了前N个文档,并对它们使用了第二个查询。这么做的结果是,文档的得分等于两个查询的得分之和。
读者应该知道,执行脚本性能低下,因此我们在第二个查询上再使用它。范例中的第一个match_all查询可能会返回成千上万的文档,如果直接在这里使用基于脚本的评分,那么性能会非常低下。由于二次评分使得我们可以在原始查询返回文档的前N个文档上重新计算得分,因而降低了对性能的影响。
现在,让我们看看如何对二次评分调优以及有哪些选项可供配置。
2.3.5 二次评分参数配置
在rescore对象中的查询对象中,必须配置下面这些参数:
  • window_size:窗口大小,该参数默认设置为from和size参数值之和。它提供了之前提到的N个文档的相关信息。该参数值指定了每个分片上参与二次评分的文档个数。
  • query_weight:查询权重值,默认等于1,原始查询的得分与二次评分的得分相加之前将乘以该值。
  • rescore_query_weight:二次评分查询的权重值,默认等于1,二次评分查询的得分在与原始查询得分相加之前,将乘以该值。
  • rescore_mode:二次评分的模式,默认设置为total,ElasticSearch 0.90.3引入了该参数(之前版本中类似的行为,该参数只能设置为total),它定义了二次评分中文档得分的计算方式,可用的选项有total、max、min、avg和multiply。当我们设置该参数值为total时,文档得分为原始查询得分与二次评分得分之和。当该参数值设置为max,文档得分为原始查询得分与二次评分得分中的最大值。与max选项类似,当该参数值设置为min时,文档得分为两次查询得分中的最小值。以此类推,参数值为avg时,文档得分为两次查询得分的平均值。当参数值为multiply时,文档得分为两次查询得分的乘积。

例如,当rescore_mode参数值为total时,文档得分按照下面的公式计算:


6ed35811dd9d75d70bb7e0942ef5fe7e2c53e0aa

请记住,在ElasticSearch 0.90.3之前,还不支持rescore_mode参数,二次评分机制只能使用默认的total选项。
2.3.6 小结
有的时候,我们会需要显示查询结果,并使页面(page)上靠前文档的顺序能受一些额外的规则控制。但遗憾的是,我们并不能通过二次评分来实现。也许读者会第一时间想到window_size参数,然而实际上这个参数与返回列表中靠前文档并无关联,它只是指定了每个分片应该返回的文档数。除此之外,window_size不能小于页面大小(如果小于页面大小,ElasticSearch会不予警告地将window_size设置为页面大小)。另外,有个非常重要的事实:二次评分功能并不能与排序一起使用,这是因为排序发生在二次评分之前,所以排序没有考虑后续新计算出来的文档得分。
前面提到的各种二次评分功能的限制和缺陷(例如,对返回文档的前3个文档及后续的5个文档分别采用不同的二次评分定义)可能限制了该功能的使用,因而用户在使用之前应三思。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9月前
|
存储 算法 API
Elasticsearch评分相关度算法解析
Elasticsearch评分相关度算法解析
106 0
|
算法 搜索推荐 索引
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
Elasticsearch相关度评分算法(三):BM25(Okapi BM25)
|
机器学习/深度学习 自然语言处理 算法
干货 | 一步步拆解 Elasticsearch BM25 模型评分细节
从 Elasticsearch 5 开始,Elasticsearch 的默认相似度算法是 Okapi BM25,Okapi BM25模型于 1994 年提出,BM25 的 BM 是缩写自 Best Match, 25 是经过 25 次迭代调整之后得出的算法,该模型也是基于 TF/IDF 进化来的,Okapi 信息检索系统是第一个实现此功能的系统,之后被广泛应用在不同系统里。 相似性(评分/排名模型)定义了匹配文档的评分方式, 对一组文档执行搜索并提供按相关性排序的结果。在这篇文章中,我们将一步步拆解 Okapi BM25 模型的内部工作原理。
1010 0
干货 | 一步步拆解 Elasticsearch BM25 模型评分细节
|
存储 搜索推荐 算法
实战 | Elasticsearch自定义评分的N种方法
1、期望Elasticsearch搜索结果更准确,不可回避的三个问题 问题1:用户真正的需求是什么? 如果不能获得用户的搜索意图,搜索的准确性无从谈起。 比如:同样输入“锤子”,工匠期望的是钉子对应的“锤子”,老罗的粉丝期望的是“锤子科技”、“锤子便签”、“锤子手机”等。 即使同一用户发出的同一个查询,也可能因为用户所处场景不同,其期望结果也存在很大差异。
610 0
实战 | Elasticsearch自定义评分的N种方法
|
索引
Elasticsearch 评分排序
背景 通过脚本改变评分 背景 近期有一个需求,需要对优惠券可用商品列表加个排序,只针对面值类的券不包括折扣券。 需求是这样的,假设有一张面值券 50 块钱,可用商品列表 A 100、B 40、C 10,当用户查询当前券可用商品列表的时候优先将卡券可以直接抵扣且不需要用户在额外支付的商品排在前面。
1532 0

热门文章

最新文章