Lucene / Solr中的短路OR运算符

时间:2013-07-22 00:40:32

标签: solr lucene boolean-logic

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

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

q = +(field1:value1 OR field2:value2)

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

如何在此背景下强制执行短路?换句话说,如何在布尔代数中实现短路,其中表达式为A || B ||如果A为真,则C返回true,甚至没有考虑B或C是否为真。

1 个答案:

答案 0 :(得分:1)

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

然而,你确实提到了分数!我怀疑你真正想要的是,如果找到一个集合中的一个查询术语,不要将得分与其他元素复合。也就是说,对于(A OR B),分数可以是score-Ascore-B,而不是score-A * score-B或某些此类(如果我在这里做出错误的假设,我很抱歉,课程)。

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

在Solr中,你应该了解DisMaxQParserPlugin,这是最近的化身,ExtendedDisMax,如果我接近这个标记,它应该能很好地为你服务。