在Elasticsearch 中,什么是相关性评分(Relevance Score)?TF-IDF 和 BM25 算法了解吗?
这是一个非常经典且核心的 Elasticsearch(以及 Lucene)面试题。
简单来说,相关性评分(Relevance Score) 决定了搜索结果的排名(Ranking)。当你执行一个全文搜索时,Elasticsearch 不仅会告诉你哪些文档匹配,还会计算每个文档与查询语句的匹配程度,并用一个浮点数 _score 来表示。
以下是关于相关性评分、TF-IDF 和 BM25 的详细解释:
1. 什么是相关性评分(Relevance Score)?
- 定义:它是 Elasticsearch 在搜索结果中为每个文档计算的一个正浮点数,字段名为
_score。 - 作用:衡量一个文档与查询条件的匹配程度。
- 规则:
_score越高,相关性越强,文档在结果列表中排得越靠前(默认情况下,ES 按_score降序排列)。 - 计算来源:底层的 Lucene 引擎根据配置的相似度算法(Similarity Algorithm)计算得出。
2. TF-IDF(Term Frequency - Inverse Document Frequency)
TF-IDF 是 Elasticsearch 5.0 之前版本的默认算法,也是信息检索领域最经典的算法。它主要由三个部分组成:
(1) TF (Term Frequency) - 词频
- 含义:检索的关键词在当前文档(字段)中出现的频率。
- 逻辑:关键词在文档中出现的次数越多,相关性越高。
- 例子:搜索 "Elasticsearch",文档 A 出现了 5 次,文档 B 出现了 1 次,A 的 TF 值更高。
(2) IDF (Inverse Document Frequency) - 逆文档频率
- 含义:检索的关键词在所有文档索引中出现的频率。
- 逻辑:关键词在所有文档中出现的越少(越稀有),该词的权重越高。
- 例子:
- 搜索 "The Elasticsearch"。
- "The" 在几乎所有文档都出现,它的 IDF 很低(权重低,甚至被视为停用词)。
- "Elasticsearch" 只在少数文档出现,它的 IDF 很高(权重高)。
- 这保证了搜索结果更偏向包含 "Elasticsearch" 的文档,而不是包含很多 "The" 的文档。
(3) Field-length Norm - 字段长度归一化
- 含义:字段内容的长度。
- 逻辑:字段越短,如果包含了关键词,相关性越高。
- 例子:搜索 "Elasticsearch"。
- 文档 A 的 title 字段是 "Mastering Elasticsearch"(短)。
- 文档 B 的 content 字段是一篇 5000 字的文章,里面提到了一次 "Elasticsearch"(长)。
- 文档 A 的匹配度更高,因为关键词在短字段中更“显眼”。
TF-IDF 的公式逻辑简述:
3. BM25 (Best Matching 25)
从 Elasticsearch 5.0 开始,BM25 取代了 TF-IDF 成为默认的相似度算法。BM25 是基于 TF-IDF 的改进版,它主要解决了 TF-IDF 在长文本和高频词上的缺陷。
为什么需要 BM25?(TF-IDF 的缺陷)
在传统的 TF-IDF 中,TF(词频)对评分的影响是线性的(或近似线性)。
- 如果一个词出现 1 次,得 1 分。
- 出现 10 次,得 10 分。
- 出现 100 次,得 100 分。
- 问题:在实际自然语言中,一个词出现 20 次和出现 10 次,其相关性的提升其实并不大(边际效应递减)。TF-IDF 会导致长文档中重复出现某词的得分过高,压制了其他更相关的文档。
BM25 的核心改进
1. 词频饱和度(TF Saturation)
BM25 引入了一个参数 (默认通常是 1.2)。
- 随着词频 TF 的增加,得分会趋于一个极限值,而不会无限增长。
- 效果:当一个词出现 5-10 次后,再多出现几次,对分数的贡献微乎其微。这更符合人类的语言认知。
2. 更好的字段长度归一化
BM25 引入了一个参数 (默认通常是 0.75)。
- 它通过对比“当前文档长度”和“所有文档平均长度”来调整权重。
- 它可以精细控制长文档对分数的惩罚力度。
BM25 vs TF-IDF 图解概念
想象一个坐标轴:
- X轴是词频(TF),Y轴是得分。
- TF-IDF 的曲线是一直向上增长的。
- BM25 的曲线是快速上升,然后慢慢变平(饱和)。
总结:面试回答要点
如果你在面试中回答这个问题,建议按以下逻辑阐述:
- 先定义:相关性评分(
_score)是衡量文档与查询匹配度的指标,分数越高排名越前。 - 讲历史 (TF-IDF):
- 它是旧版本的算法。
- 核心思想是:TF(词越多越好)、IDF(词越稀有越重要)、字段越短越好。
- 讲现状 (BM25):
- 它是现在的默认算法。
- 它是 TF-IDF 的优化版。
- 核心区别 (关键点):
- TF 饱和度:BM25 解决了 TF 无限增长导致分数偏差的问题(边际收益递减)。即:词出现 100 次和 10 次,在 BM25 中差别不大,但在 TF-IDF 中差别很大。
- BM25 在处理自然语言搜索时,结果通常比 TF-IDF 更精准。