Elasticsearch打分机制
一 例子
xx搜索引擎,就搜索结果本身而言,xx返回了正确的结果。因为返回的结果中,都包含了搜索的关键字。而我们从逻辑上来看,这一堆广告算是咋回事!这个吐槽是从用户的角度出发的。很显然,返回的结果中,尤其是前几条,有时甚至是前几页,都跟我们想要的结果相差深远!
进一步说,仅仅以二元的方式来考虑文档和查询的匹配可能是有意义的,也就是百度搜索引擎返回了二元的匹配结果:是的,找到了 or 不,没找到!虽然返回了结果,其中也包含了我们想要的结果,即便你要在大堆的广告中找正确的结果实属不易,但就像大家都习惯了广告中插播电视剧一样,习惯就好嘛!xx从x的角度出发,为广告的词条增加权重,至于那个真正的结果…
而需要xx才能访问的xx浏览器,在正确的给用户返回二元结果之前,更多的考虑文档的相关性(relevancy),因为就某个结果而言,如果A文档要比B文档更和结果相关,那么A文档在结果中就要比B文档靠前,再加上以其他的优化,最终将所有结果返回,而用户最期待的那条结果很可能排在最高位,岂不美哉?
确定文档和查询有多么相关的过程被称为打分(scoring)。
二 文档打分的运作机制:TF-IDF
Lucene
和es
的打分机制是一个公式。将查询作为输入,使用不同的手段来确定每一篇文档的得分,将每一个因素最后通过公式综合起来,返回该文档的最终得分。这个综合考量的过程,就是我们希望相关的文档被优先返回的考量过程。在Lucene
和es
中这种相关性称为得分。
在开始计算得分之前,es
使用了被搜索词条的频率和它有多常见来影响得分,从两个方面理解:
- 一个词条在某篇文档中出现的次数越多,该文档就越相关。
- 一个词条如果在不同的文档中出现的次数越多,它就越不相关!
我们称之为TF-IDF
,TF
是词频(term frequency),而IDF
是逆文档频率(inverse document frequency)。
2.1 词频:TF
考虑一篇文档得分的首要方式,是查看一个词条在文档中出现的次数,比如某篇文章围绕es
的打分展开的,那么文章中肯定会多次出现相关字眼,当查询时,我们认为该篇文档更符合,所以,这篇文档的得分会更高。
闲的蛋疼的可以Ctrl + f
搜一下相关的关键词(es,得分、打分)之类的试试。
2.2 逆文档频率:IDF
相对于词频,逆文档频率稍显复杂,如果一个词条在索引中的不同文档中出现的次数越多,那么它就越不重要。
来个例子,示例地址:
The rules-which require employees to work from 9 am to 9 pm
In the weeks that followed the creation of 996.ICU in March
The 996.ICU page was soon blocked on multiple platforms including the messaging tool WeChat and the UC Browser.
假如es
索引中,有上述3篇文档:
- 词条
ICU
的文档频率是2
,因为它出现在2篇文档中,文档的逆源自得分乘以1/DF
,DF
是该词条的文档频率,这就意味着,由于ICU
词条拥有更高的文档频率,所以,它的权重会降低。 - 词条
the
的文档频率是3
,它在3篇文档中都出现了,注意:尽管the
在后两篇文档出都出现两次,但是它的词频是还是3
,因为,逆文档词频只检查词条是否出现在某篇文档中,而不检查它在这篇文档中出现了多少次,那是词频该干的事儿。
逆文档词频是一个重要的因素,用来平衡词条的词频。比如我们搜索the 996.ICU
。单词the
几乎出现在所有的文档中(中文中比如的
),如果这个鬼东西要不被均衡一下,那么the
的频率将完全淹没996.ICU
。所以,逆文档词频就有效的均衡了the
这个常见词的相关性影响。以达到实际的相关性得分将会对查询的词条有一个更准确地描述。
当词频和逆文档词频计算完成。就可以使用TF-IDF
公式来计算文档的得分了。
三 Lucene评分公式
之前的讨论Lucene
默认评分公式被称为TF-IDF
,一个基于词频和逆文档