返回

ES 13系列:TF-IDF、BM25,揭开ES的搜索奥秘

后端

理解 Elasticsearch 中的相关性:深入剖析 TF-IDF 和 BM25

在信息检索领域,“相关性”是一个至关重要的概念,它衡量文档与特定查询之间的匹配程度。Elasticsearch (ES),一种流行的搜索引擎,利用复杂的算法来计算相关性,从而为用户提供最相关的搜索结果。本文将深入探讨 ES 中相关性的定义、计算方法以及控制相关性的选项。

相关性:定义和含义

相关性是指查询与文档之间匹配的程度。在 ES 中,相关性由多个因素决定,包括:

  • 查询词在文档中的出现频率(TF)
  • 查询词在整个语料库中的出现频率(IDF)
  • 查询词在文档中的位置和顺序
  • 查询词的大小写和语义相似度

TF-IDF:衡量词频和文档频率

TF-IDF(词频-逆向文档频率)算法是信息检索中广泛使用的经典相关性计算方法。它通过考虑查询词在文档中出现的次数(TF)以及查询词在整个语料库中出现的文档数量的倒数(IDF)来计算相关性。

TF-IDF(t, d, D) = tf(t, d) * idf(t, D)

其中:

  • t 是查询词
  • d 是文档
  • D 是语料库

TF-IDF 算法假定查询词在文档中出现的次数越多,并且在整个语料库中出现的文档数量越少,则该查询词对文档的相关性越高。

BM25:考虑文档长度和平均文档长度

BM25(最佳匹配 25)算法是另一种流行的相关性计算方法,它扩展了 TF-IDF 算法。BM25 除了考虑 TF-IDF 之外,还考虑文档长度和语料库中所有文档的平均长度。

BM25(t, d, D) = (k1 + 1) * tf(t, d) / (k1 * (1 - b + b * |d| / avgdl) + tf(t, d)) * idf(t, D)

其中:

  • k1b 是可调整的参数
  • |d| 是文档的长度
  • avgdl 是语料库中所有文档的平均长度

BM25 算法假定查询词在文档中出现的次数越多,文档长度越短,平均文档长度越长,则查询词对文档的相关性越高。

控制 ES 中的相关性

ES 提供了多种查询参数,允许用户控制相关性计算:

  • boost :为查询词分配不同的权重,权重越高,该查询词对文档的相关性越高。
  • similarity :指定要使用的相关性算法,例如 TF-IDF 或 BM25。
  • minimum_should_match :指定查询词在文档中出现的最小次数,只有满足此条件的文档才会被返回。

代码示例

以下 Python 代码示例演示了如何使用 ES 查询 DSL 控制相关性:

from elasticsearch import Elasticsearch

# 创建 ES 客户端
es = Elasticsearch()

# 创建查询体
query = {
    "query": {
        "match": {
            "title": {
                "query": "machine learning",
                "boost": 1.5  # 增加 "machine learning" 的权重
            }
        }
    },
    "min_score": 0.5  # 设置最小相关性分数阈值
}

# 执行查询
results = es.search(index="my_index", body=query)

# 打印相关文档
for hit in results['hits']['hits']:
    print(hit['_source']['title'], hit['_score'])

常见问题解答

1. TF-IDF 和 BM25 之间有什么区别?

TF-IDF 仅考虑查询词在文档和语料库中的频率,而 BM25 还考虑文档长度和平均文档长度。

2. 如何提高搜索结果的相关性?

优化查询词、调整相关性参数(如 boost)、使用同义词扩展和相关查询等技术可以提高相关性。

3. 什么是相关性阈值?

相关性阈值是过滤结果以仅返回相关性高于指定分数的文档的分数。

4. 如何使用 Elasticsearch 调试相关性?

启用查询分析功能或使用调试工具(如 kopf)可以帮助调试相关性问题。

5. 除了 TF-IDF 和 BM25 之外,还有哪些相关性算法?

其他相关性算法包括 Okapi BM25、PL2 和 LSI(潜在语义索引)。