【lucene】lucene常用查询一览

Lucene 里除了常见的 **TermQuery / BooleanQuery / PhraseQuery / FuzzyQuery / SpanNearQuery** 之外,还有不少"特殊家族"。下面按"族"归纳,一眼就能知道它们各自解决什么问题、跟普通倒排检索的差别在哪。

──────────────────

  1. **Span 族(位置级)**

已在上面讲过 SpanNearQuery,再补两个常用成员:

  • `SpanOrQuery`  ------ 多个 SpanQuery 取并集(位置层面 OR)。

  • `SpanNotQuery` ------ 先匹配 include,再剔除与 exclude 重叠的位置。

  • `SpanContainingQuery`、`SpanWithinQuery`(sandbox)------ 判断一个 span 是否包含 / 位于另一个 span 内。

  1. **Point 族(数值/多维数值)**

基于 BKD 树,不是倒排表。

  • `PointRangeQuery`(Int/Long/Float/DoubleRange)

  • `LatLonPoint.newDistanceQuery` / `newBoxQuery`(地理距离、矩形)

  • `XYPoint.newBoxQuery`(二维笛卡尔坐标)

  1. **DocValues 族(列存)**

直接扫列存,用于排序、聚合、过滤,不做倒排:

  • `SortedSetSortField`、`LongDocValuesField.newRangeQuery`

  • `DocValuesFieldExistsQuery`(过滤某列非空)

  1. **Join 族(跨文档/跨字段 join)**
  • `TermsQuery` ("大 ID 列表"查询,用于 filter cache)

  • `ParentChildrenBlockJoinQuery` (嵌套文档父子关系)

  • `ScoreMode.Avg/Total` 控制如何把子文档分数合并到父文档

  1. **Vector 族(向量检索)**

基于 HNSW 图:

  • `KnnVectorQuery`(TopK 近似最近邻)

  • `FloatVectorSimilarityQuery`(显式指定相似度函数)

  1. **Intervals 族(Lucene 8+ 新短语引擎)**

官方定位是"SpanQuery 的继任者",语法更直观:

  • `Intervals.phrase(...)`

  • `Intervals.unordered()` / `ordered()` / `maxgaps(n)`

  • `Intervals.notContain()` / `before()` / `after()`

  1. **FunctionScore / Feature 族(评分公式可编程)**
  • `FunctionScoreQuery`(把任意查询包起来,再用脚本函数改分)

  • `FeatureField.newSaturationQuery`(用 BM25 + 饱和度特征)

  1. **Script 族(脚本查询)**
  • `ScriptScoreQuery`(完全由脚本决定文档是否命中、得多少分)

  • `MatchAllDocsQuery` 的脚本版本:`_score = doc['price'].value * 0.7`

  1. **Wildcard / Prefix / Regexp 族(通配正则)**

底层都是 **AutomatonQuery**(用 DFA 和 FST 交集):

  • `WildcardQuery`  ------ 通配符 `te?t`

  • `PrefixQuery`   ------ 前缀 `abc*`

  • `RegexpQuery`   ------ 正则 `ab+c.*`

  1. **DisjunctionMaxQuery 族(取 max 而不是 sum)**

常用于"多字段同义搜索",只取子句最高分,避免简单叠加导致的暴涨。

──────────────────

速查表

| 家族 | 数据结构 | 典型场景 | 是否走倒排 |

|---|---|---|---|

| Span | positions | 短语/邻近 | 是(positions) |

| Point | BKD 树 | 数值范围、地理 | 否 |

| DocValues | 列存 | 排序、聚合、存在性 | 否 |

| Join | 倒排 + 块结构 | 父子/嵌套 | 是 |

| Vector | HNSW | 向量检索 | 否 |

| Intervals | positions | 新短语 API | 是 |

| FunctionScore | 包装任意 Query | 自定义评分 | 取决于被包查询 |

| Script | 脚本引擎 | 任意规则 | 通常绕开倒排 |

| Automaton | FST+DFA 交集 | 通配/正则/模糊 | 是 |

把这 10 张"王牌"记住,基本能覆盖 Lucene 里 90% 的特殊查询场景。