本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第2章 ,第2.1.4节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.1.4 一个例子
现在,我们已经了解评分的工作原理。接下来我们看一个在现实生活中应用评分的简单例子。首先我们需要创建一个名为scoring的新索引。使用如下命令创建这个索引:
简单起见,我们使用了只有一个物理分片和0个副本的索引(我们不需要在这个例子中关心分布式文档频率)。我们需要索引一个简单的文档,代码如下:
接着我们执行一个简单的匹配(match)查询,查询的词项是“document”。
Elasticsearch返回的结果如下:
显然,刚才索引的这个文档被匹配上了,并且被赋予了得分。我们可以通过下面这条命令来查看得分的计算过程:
Elasticsearch返回的结果如下:
可以看出,Elasticsearch给出了针对给定文档和查询的详细的得分计算过程。同时可以看出,得分等于词项频率(本例中是1)和逆文档频率(0.30685282)以及字段范数(0.625)的乘积。
现在,我们再把另一个文档加入索引。
此时,如果执行最开始的查询,我们将看到如下响应:
现在,可以对比一下TF/IDF评分公式在现实场景中的工作了。在把第2个文档索引到相同分片后(请记住我们创建的索引只有一个分片且没有副本),得分发生了变化,尽管此时的查询和刚才的一样。这是因为一些影响得分的因子已经改变了。比如,逆文档频率变了,因此得分也会跟着改变。我们还需要注意对比一下两个文档的得分。我们查询了一个单词“document”,查询匹配上了两个文档的相同字段的相同词项。第2个文档的得分为什么较低,是因为和第1个文档相比,它的name字段多了一个词项。根据先前的知识储备,我们知道,文档越短,Lucene给出的得分越高。
希望这个简短的介绍会让你对评分工作机制认识得更清楚,在你需要优化查询时理解目标查询的工作过程。