Lucene 里除了常见的 **TermQuery / BooleanQuery / PhraseQuery / FuzzyQuery / SpanNearQuery** 之外,还有不少"特殊家族"。下面按"族"归纳,一眼就能知道它们各自解决什么问题、跟普通倒排检索的差别在哪。
──────────────────
- **Span 族(位置级)**
已在上面讲过 SpanNearQuery,再补两个常用成员:
-
`SpanOrQuery` ------ 多个 SpanQuery 取并集(位置层面 OR)。
-
`SpanNotQuery` ------ 先匹配 include,再剔除与 exclude 重叠的位置。
-
`SpanContainingQuery`、`SpanWithinQuery`(sandbox)------ 判断一个 span 是否包含 / 位于另一个 span 内。
- **Point 族(数值/多维数值)**
基于 BKD 树,不是倒排表。
-
`PointRangeQuery`(Int/Long/Float/DoubleRange)
-
`LatLonPoint.newDistanceQuery` / `newBoxQuery`(地理距离、矩形)
-
`XYPoint.newBoxQuery`(二维笛卡尔坐标)
- **DocValues 族(列存)**
直接扫列存,用于排序、聚合、过滤,不做倒排:
-
`SortedSetSortField`、`LongDocValuesField.newRangeQuery`
-
`DocValuesFieldExistsQuery`(过滤某列非空)
- **Join 族(跨文档/跨字段 join)**
-
`TermsQuery` ("大 ID 列表"查询,用于 filter cache)
-
`ParentChildrenBlockJoinQuery` (嵌套文档父子关系)
-
`ScoreMode.Avg/Total` 控制如何把子文档分数合并到父文档
- **Vector 族(向量检索)**
基于 HNSW 图:
-
`KnnVectorQuery`(TopK 近似最近邻)
-
`FloatVectorSimilarityQuery`(显式指定相似度函数)
- **Intervals 族(Lucene 8+ 新短语引擎)**
官方定位是"SpanQuery 的继任者",语法更直观:
-
`Intervals.phrase(...)`
-
`Intervals.unordered()` / `ordered()` / `maxgaps(n)`
-
`Intervals.notContain()` / `before()` / `after()`
- **FunctionScore / Feature 族(评分公式可编程)**
-
`FunctionScoreQuery`(把任意查询包起来,再用脚本函数改分)
-
`FeatureField.newSaturationQuery`(用 BM25 + 饱和度特征)
- **Script 族(脚本查询)**
-
`ScriptScoreQuery`(完全由脚本决定文档是否命中、得多少分)
-
`MatchAllDocsQuery` 的脚本版本:`_score = doc['price'].value * 0.7`
- **Wildcard / Prefix / Regexp 族(通配正则)**
底层都是 **AutomatonQuery**(用 DFA 和 FST 交集):
-
`WildcardQuery` ------ 通配符 `te?t`
-
`PrefixQuery` ------ 前缀 `abc*`
-
`RegexpQuery` ------ 正则 `ab+c.*`
- **DisjunctionMaxQuery 族(取 max 而不是 sum)**
常用于"多字段同义搜索",只取子句最高分,避免简单叠加导致的暴涨。
──────────────────
速查表
| 家族 | 数据结构 | 典型场景 | 是否走倒排 |
|---|---|---|---|
| Span | positions | 短语/邻近 | 是(positions) |
| Point | BKD 树 | 数值范围、地理 | 否 |
| DocValues | 列存 | 排序、聚合、存在性 | 否 |
| Join | 倒排 + 块结构 | 父子/嵌套 | 是 |
| Vector | HNSW | 向量检索 | 否 |
| Intervals | positions | 新短语 API | 是 |
| FunctionScore | 包装任意 Query | 自定义评分 | 取决于被包查询 |
| Script | 脚本引擎 | 任意规则 | 通常绕开倒排 |
| Automaton | FST+DFA 交集 | 通配/正则/模糊 | 是 |
把这 10 张"王牌"记住,基本能覆盖 Lucene 里 90% 的特殊查询场景。