0%

查询二次评分

Elasticsearch 二次评分(Rescore):优化顶部结果相关性

在 Elasticsearch 中,当基础查询返回的顶部文档相关性不够理想时,可通过二次评分(Rescore) 机制对前 N 个文档重新计算得分,进一步优化排序。这种方式既能保证查询效率(仅处理顶部文档),又能提升关键结果的准确性,适用于需要精细调整排序的场景(如搜索引擎结果页 Top 10 优化)。

二次评分的核心原理

二次评分的工作流程如下:

  1. 基础查询:执行初始查询(如 matchbool),获取匹配文档并按得分排序。
  2. 筛选顶部文档:从每个分片的结果中选取前 window_size 个文档(默认取 from + size 个)。
  3. 重新评分:对这些顶部文档应用二次评分查询(如 function_scorescript_score),计算新得分。
  4. 合并结果:根据配置的评分模式(如求和、相乘)合并原始得分与二次评分,得到最终排序。

基础语法与示例

基本结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GET index/_search
{
"query": { // 1. 基础查询
"match": { "title": "elasticsearch" }
},
"rescore": { // 2. 二次评分配置
"window_size": 50, // 每个分片取前50个文档进行二次评分
"query": {
"rescore_query": { // 二次评分查询
"function_score": {
"script_score": {
"script": "doc['publishTime'].value / 1000000" // 以发布时间作为加分项
}
}
},
"query_weight": 0.8, // 原始得分权重
"rescore_query_weight": 0.2 // 二次评分权重
}
},
"size": 10 // 最终返回10条结果
}

得分计算逻辑

最终得分由原始查询得分和二次评分按权重合并:

1
最终得分 = (原始得分 × query_weight) + (二次评分 × rescore_query_weight)
  • 示例中,原始得分占 80% 权重,二次评分(发布时间)占 20% 权重,使较新的文档排名更靠前。

核心参数详解

参数 作用 默认值
window_size 每个分片参与二次评分的文档数量(过多会降低性能) from + size(通常为 10)
query_weight 原始查询得分的权重系数 1.0
rescore_query_weight 二次评分查询得分的权重系数 1.0
score_mode 得分合并模式(total/multiply/avg/max/min total(求和)

示例:自定义得分合并模式

1
2
3
4
5
6
7
"rescore": {
"window_size": 30,
"query": {
"rescore_query": { "term": { "is_hot": true } }, // 对热门文档加分
"score_mode": "multiply" // 原始得分 × 二次评分(热门文档得分翻倍)
}
}

多阶段二次评分

对于更复杂的场景,可通过 rescore 数组实现多阶段二次评分(如先按内容相关性,再按热度,最后按时间):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
GET articles/_search
{
"query": { "match": { "content": "AI 技术" } }, // 阶段1:内容匹配
"rescore": [
{ // 阶段2:热门文章加分
"window_size": 50,
"query": {
"rescore_query": { "term": { "is_hot": true } },
"rescore_query_weight": 0.3
}
},
{ // 阶段3:最新文章加分
"window_size": 20, // 对前20名进一步优化
"query": {
"rescore_query": {
"function_score": {
"script_score": { "script": "doc['publish_time'].value" }
}
},
"rescore_query_weight": 0.2
}
}
],
"size": 10
}

适用场景与最佳实践

1. 适用场景

  • 顶部结果优化:基础查询返回的前 10~50 条结果相关性不足(如搜索引擎、推荐系统)。
  • 多因素排序:需结合多个维度(内容匹配、热度、时间、用户行为)调整排序。
  • 性能平衡:避免对所有文档应用复杂评分逻辑,仅优化顶部结果以节省资源。

2. 最佳实践

  • 控制 window_size:取值不宜过大(建议 10~100),否则会抵消二次评分的性能优势。
  • 权重合理分配:根据业务优先级调整 query_weightrescore_query_weight(如内容匹配权重高于时间)。
  • 避免复杂脚本:二次评分的 script 应简洁(如字段值计算),复杂逻辑会增加计算开销。
  • 结合过滤:先用 filter 缩小范围,再对少量结果进行二次评分,提升效率。

与其他评分机制的对比

机制 特点 适用场景
二次评分(Rescore) 仅对顶部文档重新评分,兼顾效率与精度 优化 Top N 结果相关性
function_score 对所有匹配文档应用评分函数,功能强大但可能影响性能 全量文档的复杂评分逻辑
字段提升(Boost) 对特定字段增加权重(如 title^2),适用于简单场景 基础字段优先级调整

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10