首页/数据/NoSQL 速查/_explain 解读单文档得分
Elasticsearch89 条

_explain 解读单文档得分

_explain 返回指定文档对某查询的得分推导过程:哪个字段、哪个词条贡献了多少分,是排查排序异常与查询无命中的直接手段。

NoSQL 速查数据更新于 2026-10-13

_explain 是干什么的

_explain 返回指定文档对某个查询的得分推导过程:哪一层查询、哪个词条、哪个字段各贡献了多少分。它有两个典型用途,一是确认某篇文档为什么没被搜到(看 matched),二是排查排序异常(看哪一步把分数拉开了)。search 请求里加 "explain": true 可以对每条命中附带同样的解释。

基本信息

接口GET /<index>/_explain/<id>,请求体写 query
返回matched 是否命中、explanation.value 得分、description 逐层解释
便捷用法search 里加 "explain": true
适用版本Elasticsearch 5.x 起默认为 BM25 打分,解释层级随打分模型变化

示例

示例
# 单文档解释:为什么命不中 / 得分怎么来的
GET /my-index/_explain/1
{
  "query": { "match": { "message": "search" } }
}

# 检索时附带解释:注意响应体积会明显变大
GET /my-index/_search
{
  "explain": true,
  "size": 3,
  "query": { "match": { "message": "search" } }
}

典型使用场景

  • 命不中排查:确认是查询条件问题还是文档缺少匹配词条
  • 排序异常:同分文档过多,或某个字段权重压过其他命中
  • 权重验证:调整 boost 后确认加权是否按预期生效
  • 分析器核对:解释里出现的词条与预期分词结果不符时回查分析器
  • 得分教学:理解 tf、idf、norm 各因子对最终分数的贡献

返回结构读法

返回项含义关注点
matched是否命中该查询false 说明条件不满足,此时得分无意义
explanation.value最终得分与检索结果里的 _score 对应
explanation.description当前层打分公式从这里先判断是哪一类子查询
explanation.details子层分解逐层往下读可定位加权来源
文档不存在时返回 found: false 而不是报错,调试前先核对索引名与 ID;查询跨多个索引时要在 URI 里带上对应索引。
explain: true 会显著增大响应体并让查询多算一遍解释,只适合小批量排查,不要留在生产查询或压测脚本里。

得分解释的基本原理

检索打分是对每个候选文档逐一完成的,最终分数由各级子查询按权重合成:叶子查询贡献词条级分数,布尔查询把子查询分数相加或取最大,加权查询再乘上 boost。解释文本正是这棵打分树的展开,从最外层 description 往下逐层读,就能看出是哪一步把分数抬高或压低。如果 matched 为 false,说明在条件层面就没有命中,不必再分析分数。

解释文本里的字段名与查询结构一一对应,读到 tf、idf、norm、boost 这些层级就能定位是哪一步把分数拉开,理解各因子的含义比记住公式更有用。

易错点

  • 文档不存在返回 found: false 而不是错误,看到 false 先核对索引名与 ID,不要误判为查询语法问题
  • explain: true 让响应体积成倍增长,大结果集查询加上它会明显拖慢整批请求
  • 解释文本默认是英文且层级很深,先从最外层 description 判断子查询类型再往下钻,避免被整段文本淹没
  • 使用 filter 或 constant_score 的查询不参与打分,value 为 0 或常数属正常现象,不是解析失败

数据来源与参考

  • Elasticsearch Guide: Explain API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌