1

我知道 lucene 的 AND (&&)、OR (||) 和 NOT (!) 运算符分别是 REQUIRED、OPTIONAL 和 EXCLUDE 的简写,这就是为什么不能将它们视为布尔运算符(遵守布尔代数)。

我一直在尝试构造一个简单的OR表达式,如下

q = +(字段 1:值 1 或字段 2:值 2)

在 field1 或 field2 上匹配。但是由于 OR 只是一个可选的,其中 field1:value1 和 field2:value2 都匹配的文档,查询返回一个分数,导致两个子句都匹配。

在这种情况下如何强制短路?换句话说,如何在布尔代数中实现短路,其中表达式 A || 乙 || 如果 A 为真,则 C 返回真,甚至不考虑 B 或 C 是​​否为真。

4

1 回答 1

2

严格来说,不,不存在短路布尔逻辑。如果找到一个文档的一个术语,您不能简单地告诉它不要检查另一个术语。Lucene 是一个倒排索引,因此它不会直接检查文档是否匹配。如果您搜索A OR B,它会查找A并获取已索引该值的所有文档。然后它进入B索引,然后列出包含它的所有文档(这有点简化,但我希望它能够理解重点)。不检查A找到的文档真的没有意义。此外,对于提供的查询,仍然需要枚举文档上的所有匹配,以获得正确的分数。

但是,您确实提到了分数!我怀疑您真正想要得到的是,如果找到一组中的一个查询词,则不要将分数与其他元素复合。也就是说,对于(A OR B),分数要么是 要么是score-Ascore-B而不是score-A * score-B这样的(对不起,如果我在这里做出错误的假设,当然)。

这就是DisjunctionMaxQuery目的。将每个子查询添加到它将使它的分数等于所有子查询的分数的最大值,而不是一个产品。

在 Solr 中,您应该了解DisMaxQParserPlugin以及它最近的化身ExtendedDisMax,如果我在这里接近标记,它应该可以很好地为您服务。

于 2013-07-22T06:25:42.967 回答