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

2.3 二次评分

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

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

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

https://yqfile.alicdn.com/ac44ff89ff1b94bb9de39fc011f4abc5e6ba2816.png" >

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

正如大家所见,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时,文档得分按照下面的公式计算:

请记住,在ElasticSearch 0.90.3之前,还不支持rescore_mode参数,二次评分机制只能使用默认的total选项。
2.3.6 小结
有的时候,我们会需要显示查询结果,并使页面(page)上靠前文档的顺序能受一些额外的规则控制。但遗憾的是,我们并不能通过二次评分来实现。也许读者会第一时间想到window_size参数,然而实际上这个参数与返回列表中靠前文档并无关联,它只是指定了每个分片应该返回的文档数。除此之外,window_size不能小于页面大小(如果小于页面大小,ElasticSearch会不予警告地将window_size设置为页面大小)。另外,有个非常重要的事实:二次评分功能并不能与排序一起使用,这是因为排序发生在二次评分之前,所以排序没有考虑后续新计算出来的文档得分。
前面提到的各种二次评分功能的限制和缺陷(例如,对返回文档的前3个文档及后续的5个文档分别采用不同的二次评分定义)可能限制了该功能的使用,因而用户在使用之前应三思。

时间: 2024-09-25 15:23:35

《深入理解ElasticSearch》——2.3 二次评分的相关文章

《深入理解Elasticsearch(原书第2版)》——第2章 查询DSL进阶 2.1 Apache Lucene默认评分公式解释

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的.之后,我们还介绍了Lucene的查询语言及其用法.除此之外,我们也讨论了Elasticsearch,讨论了它的架构,以及一些核心概念.在本章,我们将深入研究Elasticsearch的查询DSL(Domain Specific Language).在了解那些高级查询之前,我们将先了解Lucene评分公式的工作原理.到本章结束,将涵盖以下内容: Lucene默认评分公式是如何工

《深入理解Elasticsearch(原书第2版)》一第2章查询DSL进阶2.1 Apache Lucene默认评分公式解释

第2章 查询DSL进阶 在上一章,我们了解了什么是Apache Lucene,它的整体架构,以及文本分析过程是如何完成的.之后,我们还介绍了Lucene的查询语言及其用法.除此之外,我们也讨论了Elasticsearch,讨论了它的架构,以及一些核心概念.在本章,我们将深入研究Elasticsearch的查询DSL(Domain Specific Language).在了解那些高级查询之前,我们将先了解Lucene评分公式的工作原理.到本章结束,将涵盖以下内容: Lucene默认评分公式是如何工

《深入理解ElasticSearch》——第3章 底层索引控制3.1 改变Apache Lucene的评分方式

第3章 底层索引控制 在上一章,我们了解了Apache Lucene如何为文档评分,什么是查询重写,如何利用ElasticSearch 0.90中的新特性,即二次评分来影响搜索返回文档的得分.同时我们也讨论了如何使用单个HTTP请求发送多个查询或准实时读取请求,以及如何对数据进行基于多值字段或嵌套文档的排序.除此之外,还介绍了如何使用数据更新 API以及如何通过使用过滤器优化查询.最后,我们介绍了如何通过使用过滤器和作用域来缩减或增加用于切面计算的文档数量.本章涵盖以下内容: 如何使用不同的评分

《深入理解Elasticsearch(原书第2版)》一2.1.3 Elasticsearch如何看评分

2.1.3 Elasticsearch如何看评分 总而言之,Elasticsearch使用了Lucene的评分功能,幸运的是Elasticsearch允许我们挑选可用的similarity类实现,或者自定义similarity类,来替换默认的评分算法.不过请记住,Elasticsearch不仅仅是Lucene的简单封装,因为它虽然使用了Lucene的评分功能,但不仅限于Lucene的评分功能.用户可以使用各种不同的查询类型,以精确控制文档评分的计算.例如使用function_score查询时,可

《深入理解Elasticsearch(原书第2版)》一导读

前 言 欢迎来到Elasticsearch的世界并阅读本书第2版.通过阅读本书,我们将带领你接触与Elasticsearch紧密相关的各种话题.请注意,本书不是为初学者写的.笔者将本书作为<Elasticsearch Server, Second Edition>的续作和姊妹篇.相对于<Elasticsearch Server>,本书涵盖了很多新知识,不过你偶尔也可以在本书中发现一些引自<Elasticsearch Server>的内容. 本书将探讨与Elasticse

《深入理解ElasticSearch》——导读

前 言 Preface 欢迎来到ElasticSearch的世界.通过阅读本书,我们将带你接触与ElasticSearch紧密相关的各种话题.本书会从介绍Apache Lucene及ElasticSearch的基本概念开始.即使读者熟悉这些知识,简略的介绍也是很有必要的,掌握背景知识对于全面理解集群构建.索引文档.搜索这些操作背后到底发生了什么至关重要. 之后,读者将学习Lucene的评分过程是如何工作的,如何影响评分,以及如何让ElasticSearch选择不同的评分算法.本书也将介绍什么是查

《深入理解ElasticSearch》——2.9 小结

2.9 小结 在本章中,我们了解了Apache Lucene是如何工作的,查询改写是什么,如何使用二次评分影响文档的评分.接下来,了解了如何在一个HTTP请求中发送多个查询和实时读取请求,以及如何对包含多值字段和嵌套文档的数据进行排序.另外,还介绍了数据更新 API和使用过滤器来优化查询的方法.最后,学习了如何使用过滤器和作用域来缩减或扩大切面计算返回的文档集.下一章中,我们将学习如何选择不同的评分公式,以及在索引期选择不同的倒排索引格式(postings format),了解多语言数据处理和事

《深入理解Elasticsearch(原书第2版)》一第1章Elasticsearch简介1.1 Apache Lucene简介

第1章 Elasticsearch简介 我们希望读者通过阅读本书来获取和拓展关于Elasticsearch的基本知识.假设读者已经知道如何使用Elasticsearch进行单次或批量索引创建,如何发送请求检索感兴趣的文档,如何使用过滤器缩减检索返回文档的数量,以及使用切面/聚合(faceting/aggregation)机制来计算数据的一些统计量.不过,在接触Elasticsearch提供的各种令人激动的功能之前,希望读者能对Apache Lucene有一个快速的了解,因为Elasticsear

《深入理解Elasticsearch(原书第2版)》——第1章 Elasticsearch简介 1.1 Apache Lucene简介

第1章 Elasticsearch简介 我们希望读者通过阅读本书来获取和拓展关于Elasticsearch的基本知识.假设读者已经知道如何使用Elasticsearch进行单次或批量索引创建,如何发送请求检索感兴趣的文档,如何使用过滤器缩减检索返回文档的数量,以及使用切面/聚合(faceting/aggregation)机制来计算数据的一些统计量.不过,在接触Elasticsearch提供的各种令人激动的功能之前,希望读者能对Apache Lucene有一个快速的了解,因为Elasticsear