ElasticSearch Elasticsearch源码解读五:搜索相关性排序算法详解
前言
说明:本文章使用的ES版本是:6.2.4
在上一篇文章Elasticsearch搜索过程详解中,介绍了ES的搜索过程。
接下来我们具体的看一下ES搜索时,是如何计算文档相关性得分并用于 排序 的。
TF-IDF
在介绍ES计算文档得分之前,先来看一下TF-IDF
算法。
TF-IDF
(Term Frequency–Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权算法。它是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF算法原理
TF-IDF
实际上是两个算法TF
和IDF
的乘积。
词频(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
不完美的地方在哪里?)
- 当两篇描述“人工智能”的文档A和B,其中A出现“人工智能”100次,B出现“人工智能”200次。两篇文章的单词数量都是10000,那么按照
TF-IDF
算法,A的tf
得分是:0.01,B的tf
得分是0.02。得分上B比A多了一倍,但是两篇文章都是再说人工智能,tf
分数不应该相差这么多。可见单纯统计的tf
算法在文本内容多的时候是不可靠的 - 多篇文档内容的长度长短不同,对
tf
算法的结果也影响很大,所以需要将文本的长度也考虑到算法当中去
基于上面两点,BM25算法做出了改进,最终该算法公式如下:
Lucene相关性算法
注:ES版本6.2.4所用的Lucene jar包版本是:7.2.1
在了解了TF-IDF
算法之后,再来了解Lucene中的相关性算法就很好理解了。
Lucene中,相关性算法如下:
ES在搜索过程中,拿到文档ID之后,就会根据搜索词,计算每篇文档的相关性得分,用其进行排序。
为您推荐与 elasticsearch 相关的帖子:
- Elasticsearch 8.8.0 发布
- Elasticsearch 8.15.3 发布
- Elasticsearch 8.15.2 发布
- Elasticsearch 8.14.2 发布
- Elasticsearch 7.17.22 发布
- Elasticsearch 8.13.3 发布
- Elasticsearch 8.13.2 发布
- Elasticsearch 8.13.1 发布
- Elasticsearch 8.12.2 发布
- Elasticsearch 8.11.3 发布
- Elasticsearch 8.11.1 发布
- Elasticsearch 8.10.1 发布
- Elasticsearch 7.17.13 和 8.9.2 版本发布
- 全文搜索引擎 Elasticsearch 入门教程
- Elasticsearch 8.7.0 发布
- Elasticsearch 8.6.2 发布
- Elasticsearch 7.17.9 发布
- Elasticsearch v8.4.2 已发布,全文搜索引擎
- Elasticsearch v8.3.3 已发布
- Elasticsearch 8.3.0 发布
- Elasticsearch源码解读六:ES中的倒排索引
- Elasticsearch源码解读四:搜索过程详解
- Elasticsearch源码解读三:创建索引过程详解
- ElasticSearch源码解读二:启动过程详解
- ElasticSearch 源码解读一:源码编译和Debug环境搭建