在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

【算法科普】BM25:搜索引擎的核心排序算法详解

默认分类 | 作者 algo_explainer | 发布于2 小时前 | | 阅读数:29

大家好,我是 @algo_explainer,今天带大家深入理解搜索引擎中最经典的排序算法 —— BM25。

什么是 BM25?

BM25(Best Match 25)是一种基于概率检索框架的排序算法,由 Stephen Robertson 于 1994 年提出。它是现代搜索引擎(包括 Elasticsearch、Lucene)的默认排序算法。

参考资源:

BM25 的核心思想

BM25 基于三个关键假设:

  1. 词频饱和度 - 一个词出现 10 次比出现 1 次重要,但出现 100 次不一定比 10 次重要 10 倍
  2. 文档长度归一化 - 长文档天然有更多词,需要公平比较
  3. 逆文档频率 - 罕见词比常见词更具区分性

公式组成

BM25 评分由三部分组成:

1. 逆文档频率(IDF)

IDF(q) = log((N - n(q) + 0.5) / (n(q) + 0.5))
  • N:总文档数
  • n(q):包含查询词 q 的文档数

2. 词频(TF)

使用饱和函数,避免词频无限增长:

TF = f(q,D) * (k1 + 1) / (f(q,D) + k1 * (1 - b + b * |D|/avgdl))

3. 参数说明

  • k1:控制词频饱和度(通常 1.2-2.0)
  • b:控制长度归一化(通常 0.75)
  • |D|:文档长度
  • avgdl:平均文档长度

与 TF-IDF 的区别

特性 TF-IDF BM25
词频处理 线性增长 饱和增长
长度归一化 简单除法 概率化归一化
理论基础 启发式 概率检索框架
实际效果 一般 更好

实际应用

BM25 是以下系统的默认排序算法:

  • Elasticsearch
  • Apache Lucene
  • Apache Solr
  • Whoosh(Python 搜索引擎库)

参数调优建议

  • 短文本搜索(如标题):k1 = 0.5-1.0
  • 长文档搜索(如文章):k1 = 1.5-2.0
  • 禁用长度归一化:b = 0
  • 强长度归一化:b = 1

总结

BM25 之所以成为行业标准,是因为它有扎实的理论基础、优秀的实际效果和灵活的参数配置。理解 BM25 是掌握搜索排序的第一步!

讨论话题

  1. 你在实际项目中调整过 BM25 参数吗?效果如何?
  2. 除了 BM25,你还了解哪些排序算法?
  3. 长文档和短文档的搜索,参数应该如何区别对待?

欢迎在评论区交流!


本文由 @algo_explainer 原创发布,转载请注明出处。

参考链接:


[尊重社区原创,转载请保留或注明出处]
本文地址:http://elasticsearch.cn/article/15669


4 个评论

感谢分享!作为新手,我想问一下 BM25 和 TF-IDF 在实际使用中差别大吗?我需要同时学习这两个算法吗?
有个问题想探讨一下:BM25 的 k1 和 b 参数在不同语言(中文 vs 英文)下是否需要调整?中文没有空格分词,对 BM25 的影响大吗?
@dev_newbie 好问题!建议先学 BM25,因为它是现代搜索引擎的标配,TF-IDF 可以作为基础了解。实际使用中,BM25 的效果普遍比 TF-IDF 好 10-20%,特别是短文本搜索。
@skeptic_wang 非常好的深入问题!确实中文场景需要特殊考虑:1)中文分词后词长比英文短,b 参数可以适当调大(0.8-0.9);2)k1 可以稍微降低(1.0-1.2),因为中文词频分布更集中。建议通过 A/B 测试找到最佳参数。

要回复文章请先登录注册