`BlockMaxConjunctionScorer` 是 Lucene 8.5+ 引入的一個高性能交集打分器(conjunction scorer),專門用于處理 多條件“與”查詢(AND 查詢) 的場景。它基于 Block-Max WAND(BMW)算法,可以提前跳過不具競爭力的文檔塊(block),從而顯著減少倒排表的解碼和打分開銷。
?
---
?
? 核心原理一句話總結:
?
> 在求多個倒排鏈交集時,先用每個 term 的 block-max 分數上界快速過濾掉不可能進入 Top-K 的文檔塊,只對可能的高分塊進行精確打分和交集計算。
?
---
?
? 工作流程(簡化)
?
1. 分塊(block):倒排鏈按 docId 分段。
2. 預聚合最大分數:每個 block 記錄該塊內 term 的 maxScore。
3. 跳過策略:
? ?- 如果某 block 的 sum(maxScore) < minCompetitiveScore,則整個 block 被跳過。
? ?- 如果當前 doc 的 maxScore < minCompetitiveScore ? 其他子句 maxScore,則該 doc 被跳過。
4. 精確打分:僅對可能進入 Top-K 的候選 doc 進行完整打分和交集驗證。
?
---
?
? 與普通 `ConjunctionScorer` 的區別
?
特性 ConjunctionScorer BlockMaxConjunctionScorer?
算法 傳統雙指針合并 Block-Max WAND?
跳過能力 無 跳過不具競爭力的 block/doc?
適用場景 精確打分 只關心 Top-K 結果?
性能 較慢(全量) 快(大量跳過)?
是否支持 `ScoreMode.TOP_SCORES` 否 是(8.5+ 默認啟用)?
?
---
?
? 觸發條件
?
- 僅在 BooleanQuery 中 所有子句為 MUST 且 ScoreMode = TOP_SCORES 時被自動使用。
- 示例:
??
```java
? BooleanQuery.Builder b = new BooleanQuery.Builder();
? b.add(new TermQuery(new Term("title", "lucene")), BooleanClause.Occur.MUST);
? b.add(new TermQuery(new Term("lang", "en")), BooleanClause.Occur.MUST);
? // 當 ScoreMode.TOP_SCORES 時,內部會構造 BlockMaxConjunctionScorer
? ```
?
---
?
? 總結一句話
?
> `BlockMaxConjunctionScorer` 是 Lucene 8.5+ 對多條件 AND 查詢的 Top-K 優化利器,通過 block-max 上界 + 提前跳過 技術,大幅減少不必要的倒排解碼與打分,顯著提升性能。