当前位置: 首页 > news >正文

【Elasticsearch】function_score与rescore

它们俩都是用来“**干涉评分**”的,但**工作阶段不同、性能开销不同、能做的事也不同**。一句话总结:

> **function_score** 在 **第一次算分** 时就动手脚;  
> **rescore** 在 **拿到 Top-N 结果后** 再“重新打分”。

下面把“能干嘛”拆开讲。

──────────────────  
1. function_score(查询阶段就改分)

• 时机:每个分片在 **收集命中文档时** 直接算完最终得分;属于 **query 阶段**。  
• 性能:对 **全部命中文档** 都生效,数据量大时成本最高。  
• 典型用途  
- 按业务权重提升/降低:新品×1.5、广告×0.8  
- 把“销量”“点击率”等数值字段线性/对数地融进分数  
- 地理位置衰减:离用户越近分数越高  
- 随机打散:给每个用户返回略有不同的排序  
- 脚本写复杂规则:if-else、正则、调用外部服务(不推荐高并发)

──────────────────  
2. rescore(先粗排,再精排)

• 时机:各分片先用原始查询拿到 **window 内的 Top-K**(默认 10×page_size),然后只在 **这 K 个文档** 上重新算分;属于 **fetch 阶段**。  
• 性能:只动少量文档,**比 function_score 轻量**。  
• 典型用途  
- 用 **昂贵脚本** 或 **复杂机器学习模型** 给 Top-K 做二次精排  
- 把 **phrase proximity**、**sloppy 查询** 放在 rescore 里,避免对全量文档计算  
- 多轮 rescore:第一轮粗排,第二轮用更复杂的模型微调  
- A/B 测试:只对小窗口做实验,不影响全量

──────────────────  
3. 简单对比

| 维度          | function_score                 | rescore                         |
|---------------|--------------------------------|---------------------------------|
| 生效阶段      | query                          | fetch(先粗排再精排)           |
| 处理文档量    | 所有命中文档                   | 窗口内的 Top-K(可配置)        |
| 性能          | 重                             | 轻(窗口小就便宜)              |
| 能否用脚本    | 能                             | 能                              |
| 能否链式      | 只能一个 function_score        | 可配多个 rescore 按顺序执行     |
| 典型场景      | 业务加权、数值衰减、随机打散   | 昂贵模型精排、phrase proximity  |

──────────────────  
4. 一句话选型

• **想对所有文档一视同仁地改分** → 用 `function_score`  
• **只想在“头部结果”上精雕细琢** → 用 `rescore`

http://www.xdnf.cn/news/1107199.html

相关文章:

  • html-初级标签
  • 【离线数仓项目】——数据模型开发实战
  • S7-200 SMART PLC:硬件、原理及接线特点全解析
  • 别再怕 JSON!5分钟带你轻松搞懂这个程序员的好帮手
  • C#调用Matlab生成的DLL
  • C++ Map 和 Set 详解:从原理到实战应用
  • win10安装Rust Webassembly工具链(wasm-pack)报错。
  • 细谈kotlin中缀表达式
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (四) 产业应用全景扫描
  • Vim的magic模式
  • javaEE——synchronized关键字
  • Linux解决vim中文乱码问题
  • Spring AOP 是如何生效的(入口源码级解析)?
  • leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
  • 【Datawhale AI夏令营】mcp-server
  • [Python] Flask 多线程绘图时报错“main thread is not in main loop”的解决方案
  • 【unity实战】在Unity实现低耦合可复用的交互系统
  • 14. 请谈一下浏览器的强缓存和协商缓存
  • 基于大模型的鼻咽癌全周期预测及诊疗优化研究报告
  • YOLO家族内战!v5/v8/v10谁才是你的真命天子?(附保姆级选择指南)
  • 推荐系统-数据分割、性能验证
  • 开源 python 应用 开发(五)python opencv之目标检测
  • (LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
  • Vue.js:从 Web 到桌面的跨端实践与技术选型指南
  • 华为IPD(集成产品开发)流程是其研发管理的核心体系
  • pdf合并
  • 基于Java的Markdown到Word文档转换工具的实现
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • css 判断是ios设备 是Safari浏览器
  • el-tree 懒加载 loadNode