Elasticsearch 搜索性能终极优化:Rescore API 重排序原理与实战全攻略
Elasticsearch 搜索性能终极优化Rescore API 重排序原理与实战全攻略前言一、什么是 Rescore API1.1 定义1.2 核心思想先粗排再精排1.3 Rescore 工作流程图1.4 为什么要用 Rescore核心价值二、Rescore API 基础语法2.1 标准结构2.2 核心参数解释三、3 大经典实战场景直接复制可用场景 1时间衰减 置顶重排序最常用场景 2脚本评分重排序script_score场景 3多字段加权重排序四、Rescore 与直接 function_score 的区别五、生产环境最佳实践六、总结Rescore API 核心一句话核心要点总结The Begin点点关注收藏不迷路前言在 Elasticsearch 海量数据搜索场景中千万级/亿级数据如果直接对所有匹配结果使用复杂排序function_score、script_score性能会极差甚至直接OOM。为了解决**「搜索精度」与「查询性能」的矛盾**ES 提供了Rescore API二次重排序。它的核心思想先快排后精排。本文将从原理、执行流程、性能优势、语法、实战场景全方位讲解 Rescore API带你掌握海量数据下的高性能精准搜索。一、什么是 Rescore API1.1 定义Rescore二次重排序不对全量匹配文档做复杂算分只对第一轮查询query返回的 Top-N 条结果执行第二轮更精准、更复杂的评分算法重新排序后返回。1.2 核心思想先粗排再精排第一阶段快速用 BM25 简单查询筛选出 Top 100/500 条。第二阶段精准只对这 100 条数据执行复杂的 script_score、function_score。1.3 Rescore 工作流程图用户搜索第一阶段全量数据简单查询BM25快速算分返回Top N条结果如前100条第二阶段Rescore重排序对N条数据执行复杂评分生成新的排序结果返回最终Top 10条给用户1.4 为什么要用 Rescore核心价值性能提升10~100倍复杂计算只针对少量数据不牺牲精度最终结果依然精准解决深度分页复杂排序性能问题适合亿级海量数据搜索二、Rescore API 基础语法2.1 标准结构GET/goods/_search{size:10,query:{match:{title:手机}// 第一阶段简单快速查询},rescore:{// 第二阶段重排序window_size:100,// 只对前100条重排序query:{rescore_query:{// 在这里写复杂的查询/评分逻辑function_score:{...}}}}}2.2 核心参数解释window_size最重要对第一轮查询结果的前 N 条进行重排序。通常设置50 ~ 1000根据性能调整。数值越大越精准但性能越低。rescore_query第二轮重排序的查询语句。可以是function_score,script_score,bool等。score_mode / boost_mode如何合并第一阶段分数和第二阶段分数。默认total 直接相加。三、3 大经典实战场景直接复制可用场景 1时间衰减 置顶重排序最常用对前100条结果根据发布时间和是否置顶重新排序。GET/news/_search{size:10,query:{match:{title:Elasticsearch}},rescore:{window_size:100,query:{rescore_query:{function_score:{query:{match_all:{}},functions:[{gauss:{publish_time:{origin:now,scale:7d}}},{weight:10,filter:{term:{is_top:1}}}],boost_mode:multiply}}}}}场景 2脚本评分重排序script_score对前100条结果使用Painless脚本动态加权。GET/goods/_search{size:10,query:{multi_match:{query:手机,fields:[title]}},rescore:{window_size:100,query:{rescore_query:{script_score:{query:{match_all:{}},script:{source:doc[sales].value * 0.01 doc[is_top].value * 5}}}}}}场景 3多字段加权重排序rescore_query:{multi_match:{query:手机,fields:[title^5,brand^3,desc^1],type:best_fields}}四、Rescore 与直接 function_score 的区别方式计算范围性能海量数据复杂度直接 function_score所有匹配文档低❌ 不支持简单Rescore 二次重排仅 Top N 条极高✅支持灵活结论数据量超过100万必须使用 Rescore五、生产环境最佳实践window_size 推荐设置首页搜索50 ~ 100高性能要求30 ~ 50高精准要求200 ~ 500第一阶段尽量简单只做关键词匹配不做复杂计算保证速度最快第二阶段放复杂逻辑时间衰减脚本评分多字段加权业务权重深度分页慎用Rescore 只针对顶部结果有效翻页太深重排序效果下降六、总结Rescore API 核心一句话先通过简单查询快速捞出Top N条候选集再针对这少量数据进行复杂的精准重排序在保证搜索精度的同时实现性能最大化。核心要点作用高性能二次重排序原理粗排 → 精排关键参数window_size重排窗口大小适用场景大数据量、复杂排序、高性能搜索必备组合Rescore function_score/script_score总结Rescore是 Elasticsearch高性能搜索的杀手锏执行流程第一次简单查询 - 第二次复杂重排序window_size控制重排数据量平衡性能与精度海量数据百万做复杂排序必须用 Rescore可结合时间衰减、脚本评分、字段加权、置顶优先The End点点关注收藏不迷路