自学内容网 自学内容网

Elasticsearch的function_score与rescore的区别


前言

在 Elasticsearch 中,function_score 和 rescore 都是对查询结果进行评分调整的机制,但它们的用途、作用范围和执行阶段有所不同。


一、function_score

rescore 是一个用于 查询后重新排序 的功能,主要对初始查询结果进行二次评分和排序。

特点

  • 执行阶段:在查询的评分阶段(query phase)执行,对每个匹配的文档重新计算评分。
  • 使用场景
    • 对于初步查询结果进行更精确的排序优化。
    • 结合更复杂的逻辑或模型(如使用 query_weight 和 rescore_query_weight)重新计算评分。
  • 主要功能
    • 支持多种函数(weight, field_value_factor, gauss, linear, exp 等)。
    • 可以将查询的评分和函数的结果组合(例如乘法、加法等)。
    • 影响的是所有匹配文档的最终评分。

常见场景

  1. 根据某个字段的值提升文档排名(如评分越高排名越靠前)。
  2. 根据地理位置距离进行动态调整。
  3. 根据文档的时间戳实现时间衰减。

示例

{
  "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 个文档进行更精细的排序。
    • 将复杂计算放到重新排序阶段,而不是影响初步查询性能。

常见场景

  1. 使用 BM25 进行初筛,然后用其他模型(如短语匹配、词对匹配)对结果进行精细排序。
  2. 多阶段查询优化:先进行粗筛,再通过更复杂的逻辑排序。

示例

{
  "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_scorerescore
执行阶段查询阶段:调整匹配文档的评分查询后排序阶段:对初筛结果重新评分
作用范围所有匹配文档查询结果的前 N 个文档(由 window_size 控制)
性能消耗对所有匹配文档评分,可能影响性能仅对部分文档评分,性能影响较小
适用场景动态评分调整(基于字段、位置、时间等)更复杂的逻辑排序或精细化模型排序
适用复杂度通常适用于简单到中等复杂度的评分逻辑适合复杂的评分逻辑,如精确短语匹配或外部模型
主要目的直接调整评分以提高结果的相关性精细化排序,提高结果的排序精度

总结

  • function_score 更适合在 查询阶段调整所有匹配文档的评分,用于基于字段或业务规则的动态评分调整。
  • rescore 更适合在 初步筛选后的精细排序,用于复杂的二次排序逻辑(例如短语匹配或基于机器学习的重新打分)。

选择哪一个取决于你的使用场景和性能需求:

  • 如果你需要动态调整所有文档的评分,使用 function_score。
  • 如果你只需要对初筛结果进行精细化排序,使用 rescore。

原文地址:https://blog.csdn.net/dh798417147/article/details/145184117

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!