Lucene 里除了常見的 **TermQuery / BooleanQuery / PhraseQuery / FuzzyQuery / SpanNearQuery** 之外,還有不少“特殊家族”。下面按“族”歸納,一眼就能知道它們各自解決什么問題、跟普通倒排檢索的差別在哪。
────────────────── ?
1. **Span 族(位置級)** ?
已在上面講過 SpanNearQuery,再補兩個常用成員: ?
- `SpanOrQuery`??—— 多個 SpanQuery 取并集(位置層面 OR)。 ?
- `SpanNotQuery`?—— 先匹配 include,再剔除與 exclude 重疊的位置。 ?
- `SpanContainingQuery`、`SpanWithinQuery`(sandbox)—— 判斷一個 span 是否包含 / 位于另一個 span 內。
2. **Point 族(數值/多維數值)** ?
基于 BKD 樹,不是倒排表。 ?
- `PointRangeQuery`(Int/Long/Float/DoubleRange) ?
- `LatLonPoint.newDistanceQuery` / `newBoxQuery`(地理距離、矩形) ?
- `XYPoint.newBoxQuery`(二維笛卡爾坐標)
3. **DocValues 族(列存)** ?
直接掃列存,用于排序、聚合、過濾,不做倒排: ?
- `SortedSetSortField`、`LongDocValuesField.newRangeQuery` ?
- `DocValuesFieldExistsQuery`(過濾某列非空)
4. **Join 族(跨文檔/跨字段 join)** ?
- `TermsQuery`?(“大 ID 列表”查詢,用于 filter cache) ?
- `ParentChildrenBlockJoinQuery`?(嵌套文檔父子關系) ?
- `ScoreMode.Avg/Total` 控制如何把子文檔分數合并到父文檔
5. **Vector 族(向量檢索)** ?
基于 HNSW 圖: ?
- `KnnVectorQuery`(TopK 近似最近鄰) ?
- `FloatVectorSimilarityQuery`(顯式指定相似度函數)
6. **Intervals 族(Lucene 8+ 新短語引擎)** ?
官方定位是“SpanQuery 的繼任者”,語法更直觀: ?
- `Intervals.phrase(...)` ?
- `Intervals.unordered()` / `ordered()` / `maxgaps(n)` ?
- `Intervals.notContain()` / `before()` / `after()`
7. **FunctionScore / Feature 族(評分公式可編程)** ?
- `FunctionScoreQuery`(把任意查詢包起來,再用腳本函數改分) ?
- `FeatureField.newSaturationQuery`(用 BM25 + 飽和度特征)
8. **Script 族(腳本查詢)** ?
- `ScriptScoreQuery`(完全由腳本決定文檔是否命中、得多少分) ?
- `MatchAllDocsQuery` 的腳本版本:`_score = doc['price'].value * 0.7`
9. **Wildcard / Prefix / Regexp 族(通配正則)** ?
底層都是 **AutomatonQuery**(用 DFA 和 FST 交集): ?
- `WildcardQuery`??—— 通配符 `te?t` ?
- `PrefixQuery`???—— 前綴 `abc*` ?
- `RegexpQuery`???—— 正則 `ab+c.*`
10. **DisjunctionMaxQuery 族(取 max 而不是 sum)** ?
常用于“多字段同義搜索”,只取子句最高分,避免簡單疊加導致的暴漲。
────────────────── ?
速查表
| 家族 | 數據結構 | 典型場景 | 是否走倒排 |
|---|---|---|---|
| Span | positions | 短語/鄰近 | 是(positions) |
| Point | BKD 樹 | 數值范圍、地理 | 否 |
| DocValues | 列存 | 排序、聚合、存在性 | 否 |
| Join | 倒排 + 塊結構 | 父子/嵌套 | 是 |
| Vector | HNSW | 向量檢索 | 否 |
| Intervals | positions | 新短語 API | 是 |
| FunctionScore | 包裝任意 Query | 自定義評分 | 取決于被包查詢 |
| Script | 腳本引擎 | 任意規則 | 通常繞開倒排 |
| Automaton | FST+DFA 交集 | 通配/正則/模糊 | 是 |
把這 10 張“王牌”記住,基本能覆蓋 Lucene 里 90% 的特殊查詢場景。