它們倆都是用來“**干涉評分**”的,但**工作階段不同、性能開銷不同、能做的事也不同**。一句話總結:
> **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`