热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本节书摘来自华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章,第2.1节,作者[美]拉斐尔酷奇&

本节书摘来自华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章,第2.1节,作者 [美]拉斐尔·酷奇(Rafal Ku)马雷克·罗戈任斯基(Marek Rogoziski),张世武 余洪淼 商旦 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第2章

查询DSL进阶

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

  • Lucene默认评分公式是如何工作的
  • 什么是查询重写
  • 什么是查询模板以及如何使用查询模板
  • 如何优化复杂的Boolean查询
  • 复杂Boolean查询的性能奥秘
  • 如何为特定场景选择合适的查询类型

2.1 Apache Lucene默认评分公式解释

评分是Apache Lucene查询处理过程的一个重要环节。评分是指针对给定查询计算某个文档的score属性的过程。什么是文档得分?它是一个刻画文档与查询匹配程度的参数。在本节,我们将了解Apache Lucene的默认评分机制:TF/IDF(词频/逆文档频率)算法以及它是如何影响文档查询结果的。了解评分公式的工作原理对构造复杂查询以及分析查询中因子的重要性都是很有价值的。同时,掌握Lucene评分机制的基础知识有助于我们更好地优化查询来获取符合我们使用场景的结果。

2.1.1 何时文档被匹配上

一个文档被Lucene返回,意味着该文档与用户提交的查询是匹配的。在这种情况下,每个被返回文档会有一个得分。在某些场景下,所有文档的得分都一样(比如使用constant_score查询),不过一般情况下,各个文档的得分是不一样的。得分越高,文档更相关,至少从Apache Lucene及其评分公式的角度来看是这样的。得分还取决于匹配的文档、查询和索引内容,因此,很显然同一个文档对不同查询的得分是不同的。读者需要注意,同一文档在不同查询中的得分不具备可比较性,不同查询返回文档中的最高得分也不具备可比较性。这是因为文档得分依赖多个因子,除了权重和查询本身的结构,还依赖被匹配的词项数目、词项所在字段,以及用于查询规范化的匹配类型,如此等等。在一些比较极端的情况下,同一个文档在相似查询中的得分非常悬殊,仅仅是因为使用了自定义得分查询或者命中词项数的急剧变化。

现在,让我们再回到评分过程。为了计算文档得分,我们需要考虑以下这些因子。

  • 文档权重(document boost):索引期赋予某个文档的权重值。
  • 字段权重(field boost):查询期赋予某个字段的权重值。
  • 协调因子(coord):基于文档中词项个数的协调因子,一个文档命中了查询中的词项越多,得分越高。
  • 逆文档频率(inverse document frequency):一个基于词项的因子,用来告诉评分公式该词项有多么罕见。逆文档频率越高,词项就越罕见。评分公式利用该因子,为包含罕见词项的文档加权。
  • 长度范数(Length norm):每字段的基于词项个数的归一化因子(在索引期被计算并存储在索引中)。一个字段包含的词项数越多,该因子的权重越低,这意味着Apache Lucene评分公式更“喜欢”包含更少词项的字段。
  • 词频(Term frequency):一个基于词项的因子,用来表示一个词项在某个文档中出现了多少次。词频越高,文档得分越高。
  • 查询范数(Query norm):一个基于查询的归一化因子,它等于查询中词项的权重平方和。查询范数使不同查询的得分能互相比较,尽管这种比较通常是困难和不可行的。

2.1.2 TF/IDF评分公式

从Lucene 4.0版本起,Lucene引入了多种不同的打分公式,这一点或许你已经有所了解了。不过,我们还是希望在此探索一下默认的TF/IDF打分公式的一些细节。请记住,为了调节查询相关性,你并不需要深入理解这个公式的来龙去脉,但是了解它的工作原理却非常重要,因为这有助于简化相关度调优过程。

1. Lucene的理论评分公式

TF/IDF公式的理论形式如下:
image

上面的公式融合了布尔检索模型和向量空间检索模型。我们不打算在此讨论理论评分公式,而是直接跳到实践中使用的评分公式,看看Lucene内部是如何实现和使用评分公式的。

 关于布尔检索模型和向量空间检索模型的知识远远超出了本书的讨论范围,想了解更多相关知识,请参考http://en.wikipedia.org/wiki/Standard_Boolean_model 和http://en.wikipedia.org/ wiki/Vector_Space_Model。

2. Lucene的实际评分公式

现在让我们看看Lucene实际使用的评分公式:
image

也许你已经看到了,评分公式是一个关于查询q和文档d的函数,正如我们之前提到的一样。有两个因子并不直接依赖查询词项,它们是coord和queryNorm,这两个因子与查询词项的一个求和公式相乘。

求和公式中每个加数由以下因子连乘所得:词频,逆文档频率,词项权重,范数。范数就是之前我们提到过的长度范数。

这个公式听起来很复杂。请别担心,你并不用记住所有的细节,你只需要意识到哪些因素是与评分有关的即可。从前面的公式我们可以导出一些基本的规则:

  • 越罕见的词项被匹配上,文档得分越高。Lucene认为包含独特单词的文档比包含常见单词的文档更重要。
  • 文档字段越短(包含更少的词项),文档得分越高。通常,Lucene更加重视较短的文档,因为这些短文档更有可能和我们查询的主题高度吻合。
  • 权重越高(不论是索引期或是查询期赋予的权重值),文档得分越高。因为更高的权重意味着特定数据(文档、词项、短语等)具有更高的重要性。

正如你所见,Lucene将最高得分赋予同时满足以下条件的文档:包含多个罕见查询词项,词项所在字段较短(该字段索引了较少的词项)。该公式更“喜欢”包含罕见词项的文档。

 如果你想了解更多关于Apache Lucene TF/IDF评分公式的信息,请参考Apache lucene 中TFIDFSimilarity类的文档:http://lucene.apache.org/core/4_9_0/core/org/ apache/lucene/search/similarities/TFIDFSimilarity.html.

2.1.3 Elasticsearch如何看评分

总而言之,Elasticsearch使用了Lucene的评分功能,幸运的是Elasticsearch允许我们挑选可用的similarity类实现,或者自定义similarity类,来替换默认的评分算法。不过请记住,Elasticsearch不仅仅是Lucene的简单封装,因为它虽然使用了Lucene的评分功能,但不仅限于Lucene的评分功能。

用户可以使用各种不同的查询类型,以精确控制文档评分的计算。例如使用function_score查询时,可以通过使用脚本(scripting)来改变文档得分,也可以使用Elasticsearch 0.90中出现的二次评分功能,通过在返回文档集之上执行另外一个查询,重新计算top-N文档的得分。

 想了解更多Apache Lucene查询类型,请参考http://lucene.apache.org/core/4_9_0/queries/org/apache/lucene/queries/package-summary.html 上的相关文档。

2.1.4 一个例子

现在,我们已经了解评分的工作原理。接下来我们看一个在现实生活中应用评分的简单例子。首先我们需要创建一个名为scoring的新索引。使用如下命令创建这个索引:
image

简单起见,我们使用了只有一个物理分片和0个副本的索引(我们不需要在这个例子中关心分布式文档频率)。我们需要索引一个简单的文档,代码如下:
image

接着我们执行一个简单的匹配(match)查询,查询的词项是“document”。
image

Elasticsearch返回的结果如下:
image

显然,刚才索引的这个文档被匹配上了,并且被赋予了得分。我们可以通过下面这条命令来查看得分的计算过程:
image

Elasticsearch返回的结果如下:
image
image

可以看出,Elasticsearch给出了针对给定文档和查询的详细的得分计算过程。同时可以看出,得分等于词项频率(本例中是1)和逆文档频率(0.30685282)以及字段范数(0.625)的乘积。

现在,我们再把另一个文档加入索引。
image

此时,如果执行最开始的查询,我们将看到如下响应:

image
image

现在,可以对比一下TF/IDF评分公式在现实场景中的工作了。在把第2个文档索引到相同分片后(请记住我们创建的索引只有一个分片且没有副本),得分发生了变化,尽管此时的查询和刚才的一样。这是因为一些影响得分的因子已经改变了。比如,逆文档频率变了,因此得分也会跟着改变。我们还需要注意对比一下两个文档的得分。我们查询了一个单词“document”,查询匹配上了两个文档的相同字段的相同词项。第2个文档的得分为什么较低,是因为和第1个文档相比,它的name字段多了一个词项。根据先前的知识储备,我们知道,文档越短,Lucene给出的得分越高。

希望这个简短的介绍会让你对评分工作机制认识得更清楚,在你需要优化查询时理解目标查询的工作过程。



推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 摘要1:ElasticSearch比较两个时间的大小_gaojie_csdn的博客-CSDN博客_es时间比较摘要2:zlasticsearch脚本教 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
  • 1.0为什么要做这个博客站?  在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了。而且下次再点击这个书签时,可能就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效。这样一来,也就不方便 ... [详细]
  • 开发笔记:使用JavaScript解决网页图片拉伸问题
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用JavaScript解决网页图片拉伸问题相关的知识,希望对你有一定的参考价值。 ... [详细]
  • es的分布式原理?es是如何实现分布式的?
    Elasticsearch设计的理念是分布式搜索引擎,底层其实是基于lucene。核心思 ... [详细]
author-avatar
恒如初见_193
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有