“opt” 在 Lucene 8.5.0 的布尔查询(BooleanQuery)里指的是 “SHOULD”子句,也就是 可选(optional)部分。
它跟刚才提到的 ReqExclScorer 所处理的 REQUIRED / EXCLUDED 逻辑是两套独立的打分 / 收集路径,二者互不重叠。
---
1. SHOULD 的含义
- 如果 BooleanQuery 没有 REQUIRED 子句(即没有 MUST、FILTER),
那么文档必须 至少满足一个 SHOULD 才会被收集;此时 Lucene 用 BooleanScorer + WAND 或 DisjunctionSumScorer 来打分并排序。
- 如果 BooleanQuery 存在 REQUIRED 子句,
那么 SHOULD 只是 “加分项”:满足就额外加权重,不满足也不影响文档被收集;此时打分公式为
```
score = reqScore + Σ(optionalBoost * coord)
```
其中 reqScore 来自 REQUIRED 子句,optionalBoost 来自匹配的 SHOULD 子句。
---
2. 与 ReqExclScorer 的关系
ReqExclScorer 只处理 MUST / MUST_NOT(即 REQUIRED / EXCLUDED)这两类子句;
SHOULD(opt)子句不参与 ReqExclScorer 的任何逻辑,它们会被封装在另外的 Scorer(如 ReqOptSumScorer 或 BooleanScorer)里,与 ReqExclScorer 并行运行或嵌套运行。
---
3. 一句话总结
> 在 Lucene 8.5.0 中,“opt”就是 BooleanClause.Occur.SHOULD 子句,表示可选加分项;它与 ReqExclScorer 处理的“必须包含 / 必须排除”逻辑无关,由另外的 Scorer 负责打分和收集。
在 Lucene 8.5.0 中,ReqExclScorer 是一种用于实现 布尔查询中“必须包含”与“必须不包含”组合逻辑 的 Scorer 类型。
✅ 作用总结:
ReqExclScorer 的作用是:
req就是required 必须
excl就是excluded 禁止
> 返回满足“required”条件的文档集合,并从中排除掉满足“excluded”(禁止)条件的文档。
换句话说,它实现了 差集操作:
比如查询表达式为 `+A -B`,表示“文档必须匹配 A,但不能匹配 B”——这时 Lucene 会使用 ReqExclScorer 来执行这个逻辑。
---
✅ 内部结构:
ReqExclScorer 包含两个核心组件:
- `reqScorer`: 表示必须满足的部分(required)。
- `exclDisi`: 表示必须排除的部分(excluded)。
在 `nextDoc()` 方法中,它会遍历 required 的文档,并逐一判断是否出现在 excluded 中,如果存在则跳过,直到找到一个合法文档或遍历结束。
---
✅ 示例场景:
假设有如下查询:
```lucene
+title:lucene -title:deprecated
```
- `+title:lucene` 是 required;
- `-title:deprecated` 是 excluded;
Lucene 会生成一个 ReqExclScorer 来返回“包含 lucene 但不包含 deprecated”的文档集合。
---
✅ 打分方式:
ReqExclScorer 的打分仅基于 required 部分的得分,excluded 部分不参与打分。
---
✅ 总结一句话:
> ReqExclScorer 是 Lucene 中用于实现布尔查询中“必须包含 + 必须不包含”逻辑的 Scorer 实现,执行差集过滤并仅基于 required 部分打分。

3868

被折叠的 条评论
为什么被折叠?



