Elasticsearch 进阶:倒排索引与相关性排序
FreeGuideOnline
最新
2026-07-03
score(D,Q) = Σ ( IDF(qi) * ( f(qi,D) * (k1 + 1) ) / ( f(qi,D) + k1 * (1 - b + b * (|D|/avgdl)) ) )
参数解读:
- `f(qi,D)`:词项 `qi` 在文档 `D` 中的词频。
- `|D|`:文档长度(字段内容的总词数)。
- `avgdl`:索引中所有文档的平均长度。
- `k1`:词频饱和参数,控制词频增长对分数的影响程度,默认 1.2。
- `b`:长度归一化程度,取值范围 [0,1],默认 0.75。
- `IDF(qi)`:逆文档频率,公式类似 `log(1 + (N - n + 0.5)/(n + 0.5))`,其中 `N` 是总文档数,`n` 是包含 `qi` 的文档数。
#### 词频饱和效果
`k1` 值越小,额外出现的词带来的分数增益衰减越快。即使你将一个词重复 10 次,分数增长也会明显趋缓,从而限制了关键词堆砌的效果。
#### 文档长度归一化效果
`b` 参数决定长度惩罚的强度。`b=0` 时不考虑长度,`b=1` 时完全按比例惩罚。对于长文档,BM25 会降低其对词频的贡献,让短文档在长度上获得公平的补偿。你可以在映射中为每个字段设置独立的 `similarity` 和参数。
### 在 Elasticsearch 中驾驭评分
#### 查看评分细节
使用 Explain API,可以透视任意查询对特定文档的评分过程:
GET /my_index/_explain/文档ID { "query": { "match": { "content": "Elasticsearch 进阶" } } }
返回结果会逐层展开每个词项的 IDF、TF 子计算以及最终的 BM25 分数,是调优的最佳显微镜。
#### 调整字段相似度
自 Elasticsearch 5.x 起,你可以为每个文本字段单独配置 `similarity`:
```json
{
"mappings": {
"properties": {
"title": {
"type": "text",
"similarity": "BM25",
"similarity": {
"k1": 1.0,
"b": 0.3
}
}
}
}
}