相关分(Relevance score)算法

Elasticsearch中的相关性是通过一个浮点的数值_score来显示的,这个_score的值越大,就表示相关性越高。那这个_score的值是如何计算的呢?

Elasticsearch采取的是TF/IDF算法来评估score的,而score决定了排序。每次搜索score分数越大的越靠前。

TF/IDF

1、TF

Term Frequency简称TF,就是搜索文本中的各个词条在要搜索的field文本中出现的次数,次数越多就越相关。

举例:

doc1:hello world,I love you
doc2:hello,I love you,too

搜索:hello world,es首先会进行分词建立倒排索引,分词成:hello和world两个单词。 发现doc1匹配了两次,doc2中只匹配了一次(hello),所以doc1的score最大,优先被匹配,会排到doc2前面。

2、IDF

Inverse Document Frequency简称IDF,就是搜索文本中的各个词条在整个index的所有document中出现的次数,出现的次数越多,越不相关。

举例:

doc1:hello,love you
doc2:hi world,I love you

搜索hello world,es分词器会将其分词成hello和world两个单词

首先hello和world在doc1和doc2中各出现了一次,其次再比如说index有10000条document,hello这个词在10000个document中出现了2000次。world这个词在10000个document中出现了100次。那么doc2更相关,因为它的次数出现的少。

3、Field-Length Norm

搜索的field对应的内容越长,相关度越弱。

举例:

doc1:{ "title": "hello java", "content": "xxxxxxxxxx1万个单词" }
doc2:{ "title": "Hi java", "content": "xxxxxxxxxx1万个单词,Hi world" }

搜索hello world,es分词器会将其分词成hello和world两个单词

首先hello和world在doc1和doc2中各出现了一次,其次假设在整个index中出现的次数也是一样多的(不像IDF那个案例中那么明显的不一致),则doc1更相关。因为title的内容比content的内容短太多了(短了一万多个单词)。所以doc1会排到doc2前面。

BM25

Elasticsearch 5 之前的版本,评分机制或者打分模型基于 TF-IDF 实现。

Elasticsearch 5 开始,Elasticsearch 的默认相似度算法是 Okapi BM25Okapi BM25模型于 1994 年提出,BM25 的 BM 是缩写自 Best Match, 25 是经过 25 次迭代调整之后得出的算法,该模型也是基于 TF/IDF 进化来的,Okapi 信息检索系统是第一个实现此功能的系统,之后被广泛应用在不同系统里。

Okapi BM25 模型的计算公式如下:

img

这里就不研究这个公式来自虐,我们记住BM25 是对 TF-IDF 算法的改进就OK了