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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介:

本节书摘来自华章出版社《深入理解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公式的理论形式如下:


0b32df0b318641166bdacd6e4d83b85a0d96d89b

上面的公式融合了布尔检索模型和向量空间检索模型。我们不打算在此讨论理论评分公式,而是直接跳到实践中使用的评分公式,看看Lucene内部是如何实现和使用评分公式的。
 关于布尔检索模型和向量空间检索模型的知识远远超出了本书的讨论范围,想了解更多相关知识,请参考 http://en.wikipedia.org/wiki/Standard_Boolean_modelhttp://en.wikipedia.org/ wiki/Vector_Space_Model。
  1. Lucene的实际评分公式
    现在让我们看看Lucene实际使用的评分公式:


bb280fe9c385d3d5cb239a71fd97d5062e18f5ca

也许你已经看到了,评分公式是一个关于查询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的新索引。使用如下


b39f86e78c3af44675d12d1633ffef7aa00cc07f

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


3568e256e70198799a3d423c743443a92e4491bd

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


fe79c8bb6fbc48118183de24a58433e8c38d87ca

Elasticsearch返回的结果如下:


51c3e08699c3ed8a70cbda824660b1355469ccd9

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


6220cb223616846c5f196c14b025e8775a8ee418

Elasticsearch返回的结果如下:


ce6a6e6361b8b9018953e74f18ea2cd297751822


7a6f849e85d037ed36a4ac6d8b5cc0bb3e5c4d57

可以看出,Elasticsearch给出了针对给定文档和查询的详细的得分计算过程。同时可以看出,得分等于词项频率(本例中是1)和逆文档频率(0.30685282)以及字段范数(0.625)的乘积。
现在,我们再把另一个文档加入索引。


febcf823346898bfdb677e2af910f3b2347e8488

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

f67124c422d6899345958bffdf27a9ee75534152


32b7060dab4c8ded01faf11a1157f3c7b7e4074c

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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
6月前
|
存储 SQL 关系型数据库
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
拉卡拉早期基于 Lambda 架构构建数据系统面临存储成本高、实时写入性能差、复杂查询耗时久、组件维护复杂等问题。为此,拉卡拉选择使用 Apache Doris 替换 Elasticsearch、Hive、Hbase、TiDB、Oracle / MySQL 等组件,实现了 OLAP 引擎的统一、查询性能提升 15 倍、资源减少 52% 的显著成效。
221 6
拉卡拉 x Apache Doris:统一金融场景 OLAP 引擎,查询提速 15 倍,资源直降 52%
|
7月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
319 20
|
存储 JSON 物联网
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
本文我们将聚焦企业最普遍使用的 JSON 数据,分别介绍业界传统方案以及 Apache Doris 半结构化数据存储分析的三种方案,并通过图表直观展示这些方案的优势与不足。同时,结合具体应用场景,分享不同需求场景下的使用方式,帮助用户快速选择最合适的 JSON 数据存储及分析方案。
444 15
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
|
12月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
538 4
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
12月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
236 0
|
12月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
213 0
|
存储 搜索推荐 API
探究:Elasticsearch 文档的 _id 是 Lucene 的 docid 吗?
【8月更文挑战第31天】在深入探索Elasticsearch(简称ES)这一强大的搜索引擎时,了解其底层存储机制——特别是与Lucene的关系,对于优化查询性能、设计高效的数据模型至关重要。其中,一个常见且容易引发误解的问题便是:Elasticsearch中文档的_id字段是否直接等同于Lucene的docid?本文将通过图文并茂的方式,详细剖析这一问题,帮助读者理解两者之间的微妙关系。
343 0
|
5月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
2137 0
|
6月前
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
890 1

热门文章

最新文章

推荐镜像

更多