Elasticsearch核心:相关性得分全解析+影响因素深度总结
-
- 一、前言
- 二、基础概念:什么是 Elasticsearch 相关性得分?
-
- 2.1 核心定义
- 2.2 相关性得分展示
- 2.3 相关性得分计算流程图
- 三、核心原理:相关性得分是怎么算出来的?
-
- 3.1 底层算法:BM25 算法(ES 默认算法)
- 3.2 三个核心基础指标
- 四、相关性得分的 7 大影响因素(最重要章节)
-
- 4.1 因素1:词频 TF(Term Frequency)
- 4.2 因素2:逆文档频率 IDF
- 4.3 因素3:字段长度归一化(Field Norm)
- 4.4 因素4:查询命中的字段数量与权重
- 4.5 因素5:分词器与匹配精度
- 4.6 因素6:查询类型(match / term / match_phrase)
- 4.7 因素7:手动权重 boost
- 五、ES 中控制相关性得分的常用查询语法
-
- 5.1 给字段设置权重 boost
- 5.2 短语匹配(提高精准度得分)
- 5.3 查看详细得分解释
- 六、提高搜索相关性得分的最佳实践
-
- 6.1 标题权重 > 内容权重
- 6.2 短字段优先展示
- 6.3 使用短语匹配保证精准度
- 6.4 避免停用词影响分数
- 6.5 合理使用中文分词
- 七、常见误区(避坑指南)
-
- 7.1 误区1:内容越长,关键词越有效
- 7.2 误区2:重复关键词能无限提高排名
- 7.3 误区3:所有字段分词一样就可以
- 7.4 误区4:_score 越高越好
- 八、总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在使用 Elasticsearch 进行搜索时,你一定会发现:搜索结果是有排序先后的。为什么有的文档排在第一,有的排在最后?核心原因就是 相关性得分( Relevance Score)。
相关性得分是 ES 全文检索的灵魂,它决定了“搜索结果与用户查询词的匹配程度”。本文将从定义、计算原理、计算公式、影响因素、优化方向全方位讲解,搭配流程图、清晰序号、标准标题格式,让你彻底掌握 ES 相关性得分。
二、基础概念:什么是 Elasticsearch 相关性得分?
2.1 核心定义
- 分数越高 → 相关性越强 → 排名越靠前
- 分数越低 → 相关性越弱 → 排名越靠后
2.2 相关性得分展示
搜索结果中自带 _score 字段:
{
"_index": "article",
"_id": "1",
"_score": 2.567, // 相关性得分
"_source": { … }
}
2.3 相关性得分计算流程图
#mermaid-svg-vkSOgYumTUYA8rw9{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-vkSOgYumTUYA8rw9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vkSOgYumTUYA8rw9 .error-icon{fill:#552222;}#mermaid-svg-vkSOgYumTUYA8rw9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vkSOgYumTUYA8rw9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vkSOgYumTUYA8rw9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vkSOgYumTUYA8rw9 .marker.cross{stroke:#333333;}#mermaid-svg-vkSOgYumTUYA8rw9 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vkSOgYumTUYA8rw9 p{margin:0;}#mermaid-svg-vkSOgYumTUYA8rw9 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster-label text{fill:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster-label span{color:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster-label span p{background-color:transparent;}#mermaid-svg-vkSOgYumTUYA8rw9 .label text,#mermaid-svg-vkSOgYumTUYA8rw9 span{fill:#333;color:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 .node rect,#mermaid-svg-vkSOgYumTUYA8rw9 .node circle,#mermaid-svg-vkSOgYumTUYA8rw9 .node ellipse,#mermaid-svg-vkSOgYumTUYA8rw9 .node polygon,#mermaid-svg-vkSOgYumTUYA8rw9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vkSOgYumTUYA8rw9 .rough-node .label text,#mermaid-svg-vkSOgYumTUYA8rw9 .node .label text,#mermaid-svg-vkSOgYumTUYA8rw9 .image-shape .label,#mermaid-svg-vkSOgYumTUYA8rw9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-vkSOgYumTUYA8rw9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vkSOgYumTUYA8rw9 .rough-node .label,#mermaid-svg-vkSOgYumTUYA8rw9 .node .label,#mermaid-svg-vkSOgYumTUYA8rw9 .image-shape .label,#mermaid-svg-vkSOgYumTUYA8rw9 .icon-shape .label{text-align:center;}#mermaid-svg-vkSOgYumTUYA8rw9 .node.clickable{cursor:pointer;}#mermaid-svg-vkSOgYumTUYA8rw9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vkSOgYumTUYA8rw9 .arrowheadPath{fill:#333333;}#mermaid-svg-vkSOgYumTUYA8rw9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vkSOgYumTUYA8rw9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vkSOgYumTUYA8rw9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vkSOgYumTUYA8rw9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vkSOgYumTUYA8rw9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vkSOgYumTUYA8rw9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster text{fill:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 .cluster span{color:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 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-vkSOgYumTUYA8rw9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vkSOgYumTUYA8rw9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-vkSOgYumTUYA8rw9 .icon-shape,#mermaid-svg-vkSOgYumTUYA8rw9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vkSOgYumTUYA8rw9 .icon-shape p,#mermaid-svg-vkSOgYumTUYA8rw9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vkSOgYumTUYA8rw9 .icon-shape .label rect,#mermaid-svg-vkSOgYumTUYA8rw9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vkSOgYumTUYA8rw9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vkSOgYumTUYA8rw9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vkSOgYumTUYA8rw9 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
用户输入查询词
分词处理
查询词与文档进行匹配
计算TF词频
计算IDF逆文档频率
计算字段长度归一值
加权求和得到_score
按_score从高到低排序
返回最终搜索结果
三、核心原理:相关性得分是怎么算出来的?
3.1 底层算法:BM25 算法(ES 默认算法)
从 ES 5.0 开始,默认使用 BM25 算法 计算相关性得分,替代了传统的 TF-IDF。
BM25 公式简化版:
_score = IDF(词) × TF(词) × 长度归一化 × 权重
3.2 三个核心基础指标
四、相关性得分的 7 大影响因素(最重要章节)
4.1 因素1:词频 TF(Term Frequency)
- 文档A:Elasticsearch 学习教程
- 文档B:Elasticsearch Elasticsearch 教程
- 搜索:Elasticsearch
- 结果:文档B得分更高
4.2 因素2:逆文档频率 IDF
- 搜索词:中国 航天
- 中国很常见 → 权重低
- 航天很稀有 → 权重高
4.3 因素3:字段长度归一化(Field Norm)
- 标题(短)命中关键词 → 得分极高
- 正文(长)命中关键词 → 得分相对较低
4.4 因素4:查询命中的字段数量与权重
- 命中字段越多 → 分数越高
- 手动设置字段权重(boost)→ 权重越高分数越高
- title^3 content → 标题权重是正文的3倍
4.5 因素5:分词器与匹配精度
- 分词不一致 → 无法匹配 → 得分为0
- 完全匹配 → 得分高
- 部分匹配 → 得分低
4.6 因素6:查询类型(match / term / match_phrase)
不同查询方式,得分计算规则不同:
4.7 因素7:手动权重 boost
- 商品标题权重 > 商品描述
- 最新发布的文档权重更高
五、ES 中控制相关性得分的常用查询语法
5.1 给字段设置权重 boost
GET /product/_search
{
"query": {
"multi_match": {
"query": "手机",
"fields": ["title^3", "desc^1"] // title权重3倍
}
}
}
5.2 短语匹配(提高精准度得分)
GET /article/_search
{
"query": {
"match_phrase": {
"title": "Elasticsearch 教程"
}
}
}
5.3 查看详细得分解释
GET /index/_search?explain=true
{
"query": { "match": { "title": "ES" } }
}
explain=true 可以看到每一步分数计算过程。
六、提高搜索相关性得分的最佳实践
6.1 标题权重 > 内容权重
给标题设置更高的 boost(3~10倍)。
6.2 短字段优先展示
标题、标签等短字段命中,得分天然更高。
6.3 使用短语匹配保证精准度
match_phrase 适合搜索精准关键词。
6.4 避免停用词影响分数
过滤掉无意义词(的、了、是、在)。
6.5 合理使用中文分词
IK 分词能大幅提高中文相关性准确性。
七、常见误区(避坑指南)
7.1 误区1:内容越长,关键词越有效
❌ 错误 ✅ 正确:内容越长,分数会被归一化压低
7.2 误区2:重复关键词能无限提高排名
❌ 错误 ✅ 正确:BM25 会限制词频,过度重复不会加分
7.3 误区3:所有字段分词一样就可以
❌ 错误 ✅ 正确:索引分词和查询分词必须一致,否则得分为0
7.4 误区4:_score 越高越好
❌ 错误 ✅ 正确:业务需要合理排序,过度追求分数会导致结果不合理
八、总结

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



