Elasticsearch高级查询精讲:dis_max查询原理与评分机制全解析
- 前言
- 一、dis_max 查询核心认知
- 1.1 什么是 dis_max 查询?
- 1.2 为什么需要 dis_max?
- 1.3 dis_max 执行流程(可视化)
- 二、dis_max 基础语法与评分规则
- 2.1 标准语法
- 2.2 评分规则(核心!)
- 2.3 评分示例
- 三、dis_max 与 bool should 的核心区别(重点)
- 示例对比
- 四、高级优化:tie_breaker 平滑评分(生产必备)
- 4.1 问题
- 4.2 解决方案:tie_breaker
- 4.3 语法
- 4.4 最终评分公式
- 4.5 示例
- 4.6 最佳实践
- 五、dis_max 在 multi_match 中的应用(最常用)
- 六、dis_max 查询适用场景
- 七、总结:dis_max 核心价值
- 总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
前言
在 Elasticsearch 多字段搜索场景中(标题、描述、标签联合检索),默认的bool should会累加所有字段得分,经常导致“只在正文中多次出现关键词”的低质量文档排到最前面,标题精准匹配的优质文档反而排名靠后。
为了解决这个问题,ES 提供了dis_max(Disjunction Max Query)分离最大化查询,它是实现精准、自然搜索排序的核心查询方式,也是电商、内容搜索的最优实践。
本文将从定义、工作原理、执行流程、评分规则、与bool查询对比、tie_breaker调优全维度讲解 dis_max 查询,搭配流程图+实战代码,让你彻底掌握它的评分逻辑。
一、dis_max 查询核心认知
1.1 什么是 dis_max 查询?
官方定义:dis_max(Disjunction Max Query)分离最大化查询,属于多条件/多字段查询,它会从所有匹配的子查询中只取最高分作为文档最终得分,忽略其他低分字段。
通俗理解:
- 多个查询条件“并列竞争”
- 谁得分最高,就以谁为准
- 不叠加、不平均,只取最佳匹配
1.2 为什么需要 dis_max?
解决bool should 累加得分导致的排名异常问题:
- 标题精准匹配 = 得分高
- 正文堆砌关键词 = 得分虚高
- dis_max 让最佳匹配字段决定排名,更符合用户搜索习惯
1.3 dis_max 执行流程(可视化)
二、dis_max 基础语法与评分规则
2.1 标准语法
GET/goods/_search{"query":{"dis_max":{"queries":[{"match":{"title":"华为手机"}},{"match":{"desc":"华为手机"}},{"match":{"tags":"华为手机"}}]}}}2.2 评分规则(核心!)
- 每个子查询(字段)独立算分
- 只取最高分
- 其他字段得分直接忽略
- 最终
_score= 单个字段最高分
2.3 评分示例
- title 得分:20.0
- desc 得分:5.0
- tags 得分:3.0
- 最终分数 = 20.0
三、dis_max 与 bool should 的核心区别(重点)
| 维度 | dis_max(取最高分) | bool should(分数累加) |
|---|---|---|
| 评分逻辑 | 取最高单个分数 | 所有字段分数相加 |
| 排名表现 | 标题精准匹配优先 | 正文堆砌关键词排第一 |
| 精准度 | 高 | 低,易虚高 |
| 适用场景 | 电商、内容、精准搜索 | 简单检索、非精准场景 |
| 用户体验 | 更自然、更合理 | 容易出现不相关结果 |
示例对比
文档A:标题匹配(20分),描述不匹配
文档B:标题不匹配,描述匹配多次(18分)
- dis_max:A(20) > B(18) ✅
- bool should:A(20) < B(18+…) ❌
四、高级优化:tie_breaker 平滑评分(生产必备)
4.1 问题
dis_max只取最高分,其他字段完全不参与评分,会丢失部分匹配信息。
4.2 解决方案:tie_breaker
tie_breaker(0~1之间小数):
- 最高分100% 计入
- 其他字段得分 × tie_breaker计入总分
4.3 语法
GET/goods/_search{"query":{"dis_max":{"queries":[{"match":{"title":"华为手机"}},{"match":{"desc":"华为手机"}}],"tie_breaker":0.3}}}4.4 最终评分公式
最终得分 = 最高分 + (其他分数 × tie_breaker)4.5 示例
- title:20分
- desc:5分
- tie_breaker=0.3
- 最终得分 = 20 + 5×0.3 = 21.5
4.6 最佳实践
tie_breaker 推荐值:0.2 ~ 0.4
- 0.3 是企业级通用最优值
五、dis_max 在 multi_match 中的应用(最常用)
multi_match默认使用best_fields类型,底层就是 dis_max!
GET/goods/_search{"query":{"multi_match":{"query":"华为手机","fields":["title^3","desc^1","tags^2"],"type":"best_fields","tie_breaker":0.3}}}等价于 dis_max 查询,生产环境标准写法。
六、dis_max 查询适用场景
- 电商商品搜索(标题 > 描述)
- 文章/新闻搜索(标题精准优先)
- 简历搜索(技能名称 > 详情)
- 任何需要“最佳匹配优先”的搜索场景
七、总结:dis_max 核心价值
- 解决多字段得分虚高问题
- 让最佳匹配字段决定排名
- tie_breaker 实现平滑加权
- 是高精度搜索的基础查询
- multi_match best_fields 底层就是 dis_max
总结
- dis_max:分离最大化查询,取多个字段中的最高分为最终得分
- 评分规则:只认最高分,忽略其他字段(加 tie_breaker 可平滑)
- 优势:避免关键词堆砌排名虚高,让标题精准匹配排第一
- 最佳实践:
tie_breaker=0.3,精度最高 - 底层关系:
multi_match type=best_fields= dis_max 查询
🌺The End🌺点点关注,收藏不迷路🌺 |