ElasticSearch Elasticsearch源码解读五:搜索相关性排序算法详解

kenton · 2021-04-28 15:15:00 · 热度: 72

前言

说明:本文章使用的ES版本是:6.2.4

在上一篇文章Elasticsearch搜索过程详解中,介绍了ES的搜索过程。

接下来我们具体的看一下ES搜索时,是如何计算文档相关性得分并用于 排序 的。

TF-IDF

在介绍ES计算文档得分之前,先来看一下TF-IDF算法。

TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权算法。它是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF算法原理

TF-IDF实际上是两个算法TFIDF的乘积。

词频(Term Frequency,TF)

词频的所在对象是一个具体的文档,是指一个文档中出现某个单词(Term)的频率(Frequency)。这里用的是频率而不是次数,是为了防止文档内容过长从而导致某些单词出现过多。为了正确评价一个单词在一个文档中的重要程度,需要将出现次数归一化,其算法如下:

逆向文件频率(Inverse Document Frequency,IDF)

逆向文件频率描述的对象是一个文档集合中,包含某个单词的文档数量。它表示的是一个单词在一个文档集合中的普遍重要程度。将其归一化的算法入下:

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语。

TF—IDF总结

  • TF表示的是一个单词在一段文本中的重要程度,随着单词的增加而增加
  • IDF表示的是一个单词在一个文档集合中的重要程度,越稀有权重越高,所以它随着单词的增加而降低

TF-IDF算法举例

用上面的公式,计算一个例子。

OKapi BM25算法原理

BM25(Best Match25)是在信息检索系统中根据提出的query对document进行评分的算法。

TF-IDF算法是一个可用的算法,但并不太完美。它给出了一个基于统计学的相关分数算法,而BM25算法则是在此之上做出改进之后的算法。(为什么要改进呢?TF-IDF不完美的地方在哪里?)

  1. 当两篇描述“人工智能”的文档A和B,其中A出现“人工智能”100次,B出现“人工智能”200次。两篇文章的单词数量都是10000,那么按照TF-IDF算法,A的tf得分是:0.01,B的tf得分是0.02。得分上B比A多了一倍,但是两篇文章都是再说人工智能,tf分数不应该相差这么多。可见单纯统计的tf算法在文本内容多的时候是不可靠的
  2. 多篇文档内容的长度长短不同,对tf算法的结果也影响很大,所以需要将文本的长度也考虑到算法当中去

基于上面两点,BM25算法做出了改进,最终该算法公式如下:

Lucene相关性算法

注:ES版本6.2.4所用的Lucene jar包版本是:7.2.1

在了解了TF-IDF算法之后,再来了解Lucene中的相关性算法就很好理解了。

Lucene中,相关性算法如下:

ES在搜索过程中,拿到文档ID之后,就会根据搜索词,计算每篇文档的相关性得分,用其进行排序。

为您推荐与 elasticsearch 相关的帖子:

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册