欢迎光临
我们一直在努力

Elasticsearch核心原理精讲:BM25评分公式全解析与各参数含义详解

Elasticsearch核心原理精讲:BM25评分公式全解析与各参数含义详解

    • 前言
    • 一、Elasticsearch 默认评分公式(BM25)
      • 1.1 官方标准公式
      • 1.2 公式一句话总结
      • 1.3 评分计算执行流程(可视化)
    • 二、公式各组成部分详细解释(序号化逐行拆解)
      • 2.1 Σ(求和符号)
      • 2.2 IDF(q) :逆文档频率(词条稀有度)
      • 2.3 tf(t,d) :词频(Term Frequency)
      • 2.4 k1 :词频饱和系数
      • 2.5 b :长度归一化系数
      • 2.6 len(d) / avg_len :长度比例
      • 2.7 完整公式组合逻辑(最简理解版)
    • 三、公式各部分作用总结(超清晰)
    • 四、BM25 公式为什么比 TF-IDF 更强?
    • 五、实战:如何查看 ES 真实评分计算?
    • 六、如何根据公式调优搜索相关性?
    • 七、总结
      • 总结

🌺The Begin🌺点点关注,收藏不迷路🌺

前言

在 Elasticsearch 中,相关性评分(_score) 直接决定搜索结果的排序,而它的底层就是一套严谨的数学公式。从 5.x 版本开始,ES 就抛弃了传统的 TF-IDF,默认使用 BM25 评分公式,这也是所有现代搜索引擎(Lucene/Solr/ES)的标准算法。

很多开发者知道词频、稀有度影响分数,但对完整公式、每个参数的作用、数值如何计算一知半解,导致搜索排序无法精准调优。

本文将用最通俗的语言 + 公式拆解 + 流程图 + 实战示例,完整讲解 Elasticsearch 的评分公式,逐字解释每个部分的含义,让你彻底看懂 _score 是怎么算出来的。


一、Elasticsearch 默认评分公式(BM25)

1.1 官方标准公式

Elasticsearch 当前所有新版本(7.x/8.x/9.x) 相关性评分公式如下:

Score(d,q) = Σ [ IDF(q) × ( tf(t,d) × (k1 + 1) ) / ( tf(t,d) + k1 × ( 1 – b + b × ( len(d) / avg_len ) ) ) ]

1.2 公式一句话总结

文档最终得分 = 每个查询词的(稀有度权重 × 词频饱和得分 × 长度归一化因子)之和

1.3 评分计算执行流程(可视化)

#mermaid-svg-vGvSqro9nqHqpPgG{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vGvSqro9nqHqpPgG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vGvSqro9nqHqpPgG .error-icon{fill:#552222;}#mermaid-svg-vGvSqro9nqHqpPgG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vGvSqro9nqHqpPgG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vGvSqro9nqHqpPgG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vGvSqro9nqHqpPgG .marker.cross{stroke:#333333;}#mermaid-svg-vGvSqro9nqHqpPgG svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vGvSqro9nqHqpPgG p{margin:0;}#mermaid-svg-vGvSqro9nqHqpPgG .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vGvSqro9nqHqpPgG .cluster-label text{fill:#333;}#mermaid-svg-vGvSqro9nqHqpPgG .cluster-label span{color:#333;}#mermaid-svg-vGvSqro9nqHqpPgG .cluster-label span p{background-color:transparent;}#mermaid-svg-vGvSqro9nqHqpPgG .label text,#mermaid-svg-vGvSqro9nqHqpPgG span{fill:#333;color:#333;}#mermaid-svg-vGvSqro9nqHqpPgG .node rect,#mermaid-svg-vGvSqro9nqHqpPgG .node circle,#mermaid-svg-vGvSqro9nqHqpPgG .node ellipse,#mermaid-svg-vGvSqro9nqHqpPgG .node polygon,#mermaid-svg-vGvSqro9nqHqpPgG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vGvSqro9nqHqpPgG .rough-node .label text,#mermaid-svg-vGvSqro9nqHqpPgG .node .label text,#mermaid-svg-vGvSqro9nqHqpPgG .image-shape .label,#mermaid-svg-vGvSqro9nqHqpPgG .icon-shape .label{text-anchor:middle;}#mermaid-svg-vGvSqro9nqHqpPgG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vGvSqro9nqHqpPgG .rough-node .label,#mermaid-svg-vGvSqro9nqHqpPgG .node .label,#mermaid-svg-vGvSqro9nqHqpPgG .image-shape .label,#mermaid-svg-vGvSqro9nqHqpPgG .icon-shape .label{text-align:center;}#mermaid-svg-vGvSqro9nqHqpPgG .node.clickable{cursor:pointer;}#mermaid-svg-vGvSqro9nqHqpPgG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vGvSqro9nqHqpPgG .arrowheadPath{fill:#333333;}#mermaid-svg-vGvSqro9nqHqpPgG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vGvSqro9nqHqpPgG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vGvSqro9nqHqpPgG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vGvSqro9nqHqpPgG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vGvSqro9nqHqpPgG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vGvSqro9nqHqpPgG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vGvSqro9nqHqpPgG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vGvSqro9nqHqpPgG .cluster text{fill:#333;}#mermaid-svg-vGvSqro9nqHqpPgG .cluster span{color:#333;}#mermaid-svg-vGvSqro9nqHqpPgG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vGvSqro9nqHqpPgG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vGvSqro9nqHqpPgG rect.text{fill:none;stroke-width:0;}#mermaid-svg-vGvSqro9nqHqpPgG .icon-shape,#mermaid-svg-vGvSqro9nqHqpPgG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vGvSqro9nqHqpPgG .icon-shape p,#mermaid-svg-vGvSqro9nqHqpPgG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vGvSqro9nqHqpPgG .icon-shape .label rect,#mermaid-svg-vGvSqro9nqHqpPgG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vGvSqro9nqHqpPgG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vGvSqro9nqHqpPgG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vGvSqro9nqHqpPgG :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

用户输入查询词

分词得到多个词条

计算每个词条的 IDF(稀有度)

计算词条在文档中的 TF(词频)

计算文档长度 / 平均长度

计算长度归一化系数

计算词频饱和分数

IDF × 词频得分 = 单词条得分

所有词条得分相加 = 最终_score

按分数从高到低排序


二、公式各组成部分详细解释(序号化逐行拆解)

我们把公式拆成 5 个核心部分,每个部分都有明确的业务含义:

2.1 Σ(求和符号)

  • 含义:对所有查询词的分数累加求和
  • 作用:多词搜索时,每个词的得分相加,匹配词越多分数越高

2.2 IDF(q) :逆文档频率(词条稀有度)

公式内部形式:

IDF = ln( (N – df + 0.5) / (df + 0.5) + 1 )

  • N:索引中文档总数
  • df:包含该词条的文档数量

含义:

  • 词条越稀有,IDF 值越大
  • 词条越常见(如“的”“是”“the”),IDF 越小

例子:

  • Elasticsearch:稀有词 → IDF 高
  • 教程:常见词 → IDF 低

2.3 tf(t,d) :词频(Term Frequency)

  • 含义:查询词在当前文档中出现的次数
  • 作用:出现次数越多,相关性越强
  • 注意:BM25 会限制它的上限(不会无限涨分)

2.4 k1 :词频饱和系数

  • 默认值:1.2
  • 含义:控制词频对分数的影响强度
  • 作用:
    • k1 越大,词频影响越大
    • k1 越小,词频影响越小
  • 核心价值:实现词频饱和,避免关键词堆砌刷分

2.5 b :长度归一化系数

  • 默认值:0.75
  • 含义:控制文档长度对分数的影响程度
  • 取值范围:0 ~ 1
    • b=1:完全按长度归一化
    • b=0:关闭长度影响
  • 作用:让短文档(标题)权重更高

2.6 len(d) / avg_len :长度比例

  • len(d):当前文档字段长度(词数)
  • avg_len:索引中所有文档的平均长度
  • 含义:文档越长,该项越大,分数会被降低

2.7 完整公式组合逻辑(最简理解版)

得分 = 求和(
稀有度权重 ×
[ 词频 / (词频 + 饱和系数) ] ×
[ 1 / (长度因子) ]
)


三、公式各部分作用总结(超清晰)

符号/部分名称作用影响
IDF 逆文档频率 词条稀有度 越稀有分越高
TF 词频 词条在文档中出现次数 次数越多分越高
k1 词频饱和系数 限制词频无限涨分 抑制关键词堆砌
b 长度归一化系数 惩罚长文本,奖励短文本 标题 > 正文
len(d)/avg_len 文档长度比例 越长的文档分数越低 避免长文虚假相关
Σ 求和 多词搜索分数相加 匹配词越多越相关

四、BM25 公式为什么比 TF-IDF 更强?

  • TF-IDF 公式

    Score = TF × IDF

    缺点:词频无上限、不考虑文档长度、容易刷分

  • BM25 改进点

    • 词频有饱和上限
    • 加入长度归一化
    • 增加可调参数 k1、b
    • 更稳定、更精准、更符合真实搜索习惯

  • 五、实战:如何查看 ES 真实评分计算?

    使用 explain: true 可以看到公式每一步的计算结果:

    GET /my_index/_search
    {
    "explain": true,
    "query": {
    "match": {
    "title": "elasticsearch 教程"
    }
    }
    }

    返回结果会显示:

    • idf
    • tf
    • fieldWeight
    • 最终 score

    六、如何根据公式调优搜索相关性?

  • 标题字段
    • b 调小(如 0.5),减少长度影响
  • 长文本字段
    • b 调大(如 0.8)
  • 避免关键词堆砌
    • k1 保持默认 1.2 即可
  • 提高精准度
    • 对重要字段使用 ^3 权重提升

  • 七、总结

    Elasticsearch 的默认评分公式是 BM25,它由 IDF(稀有度)、TF(词频)、k1(饱和)、b(长度归一化) 四大部分组成。

    • IDF 决定词的重要性
    • TF 决定匹配强度
    • k1 防止词频无限涨分
    • b 让短文本权重更高

    理解这套公式,你就能完全掌握 ES 搜索排序规则,成为搜索调优高手。


    总结

  • ES 默认评分公式:BM25
  • 核心公式:Score = Σ( IDF × TF相关 × 长度相关 )
  • 4 大核心组件:IDF(稀有度)、TF(词频)、k1(饱和)、b(长度归一化)
  • 优势:词频饱和、长度归一化、抗作弊、排序精准
  • explain: true 可查看每一步真实计算过程
  • 我可以帮你整理一篇 可直接发布到 CSDN 的最终版完整博文合集,把你之前问的所有 ES 高频面试题(深分页、Bulk、BM25、评分、River、多语言、Search Guard)整合成 一套完整的 Elasticsearch 进阶专栏,要帮你整理吗?

    在这里插入图片描述

    🌺The End🌺点点关注,收藏不迷路🌺

    赞(0)
    未经允许不得转载:171主机测评 » Elasticsearch核心原理精讲:BM25评分公式全解析与各参数含义详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址