文章目录
- 前言
- 一、function_score
- 二、rescore
- 三、区别对比
- 总结
前言
在 Elasticsearch 中,function_score 和 rescore 都是对查询结果进行评分调整的机制,但它们的用途、作用范围和执行阶段有所不同。
一、function_score
rescore 是一个用于 查询后重新排序 的功能,主要对初始查询结果进行二次评分和排序。
特点
- 执行阶段:在查询的评分阶段(query phase)执行,对每个匹配的文档重新计算评分。
- 使用场景:
- 对于初步查询结果进行更精确的排序优化。
- 结合更复杂的逻辑或模型(如使用 query_weight 和 rescore_query_weight)重新计算评分。
- 主要功能:
- 支持多种函数(
weight
,field_value_factor
,gauss
,linear
,exp
等)。 - 可以将查询的评分和函数的结果组合(例如乘法、加法等)。
- 影响的是所有匹配文档的最终评分。
- 支持多种函数(
常见场景
- 根据某个字段的值提升文档排名(如评分越高排名越靠前)。
- 根据地理位置距离进行动态调整。
- 根据文档的时间戳实现时间衰减。
示例
{"query": {"function_score": {"query": { "match": { "title": "elasticsearch" } },"functions": [{"field_value_factor": {"field": "popularity","factor": 1.2,"modifier": "sqrt"}},{"gauss": {"publish_date": {"origin": "2025-01-01","scale": "10d"}}}],"boost_mode": "sum"}}
}
- 作用:
- 基于文档的
popularity
字段调整评分。 - 根据文档发布时间计算时间衰减。
- 基于文档的
二、rescore
rescore 是一个用于 查询后重新排序 的功能,主要对初始查询结果进行二次评分和排序。
特点
- 执行阶段:在查询的结果集返回前,对前 N 个(通常是 top-k)匹配的文档重新评分。
- 使用场景:
- 对于初步查询结果进行更精确的排序优化。
- 结合更复杂的逻辑或模型(如使用 query_weight 和 rescore_query_weight)重新计算评分。
- 主要功能:
- 只对初步查询结果的前 N 个文档进行二次评分(默认 window_size 为 10)。
- 提高查询性能,因为它不需要对所有匹配文档重新评分。
- 适合场景:
- 使用简单的查询快速过滤大规模数据集,然后对前 N 个文档进行更精细的排序。
- 将复杂计算放到重新排序阶段,而不是影响初步查询性能。
常见场景
- 使用 BM25 进行初筛,然后用其他模型(如短语匹配、词对匹配)对结果进行精细排序。
- 多阶段查询优化:先进行粗筛,再通过更复杂的逻辑排序。
示例
{"query": {"match": { "title": "elasticsearch" }},"rescore": {"window_size": 50,"query": {"rescore_query": {"match_phrase": { "title": "elasticsearch guide" }},"query_weight": 0.7,"rescore_query_weight": 2.0}}
}
- 作用:
- 初筛阶段:通过 match 查询找到所有与 elasticsearch 匹配的文档。
- 重排序阶段:对前 50 个文档用短语匹配(match_phrase)重新计算评分,并进行权重调整。
三、区别对比
特性 | function_score | rescore |
---|---|---|
执行阶段 | 查询阶段:调整匹配文档的评分 | 查询后排序阶段:对初筛结果重新评分 |
作用范围 | 所有匹配文档 | 查询结果的前 N 个文档(由 window_size 控制) |
性能消耗 | 对所有匹配文档评分,可能影响性能 | 仅对部分文档评分,性能影响较小 |
适用场景 | 动态评分调整(基于字段、位置、时间等) | 更复杂的逻辑排序或精细化模型排序 |
适用复杂度 | 通常适用于简单到中等复杂度的评分逻辑 | 适合复杂的评分逻辑,如精确短语匹配或外部模型 |
主要目的 | 直接调整评分以提高结果的相关性 | 精细化排序,提高结果的排序精度 |
总结
- function_score 更适合在 查询阶段调整所有匹配文档的评分,用于基于字段或业务规则的动态评分调整。
- rescore 更适合在 初步筛选后的精细排序,用于复杂的二次排序逻辑(例如短语匹配或基于机器学习的重新打分)。
选择哪一个取决于你的使用场景和性能需求:
- 如果你需要动态调整所有文档的评分,使用 function_score。
- 如果你只需要对初筛结果进行精细化排序,使用 rescore。