据我所知,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是否为真。
答案 0 :(得分:1)
严格来说,不,没有短路布尔逻辑。如果找到一个术语的文档,则不能简单地告诉它不要检查另一个术语。 Lucene是一个倒排索引,因此它不能直接检查匹配文档。如果您搜索A OR B
,它会找到A
并获取索引该值的所有文档。然后它在索引中得到B
,然后列出包含它的所有文档(这有点简化,但我希望它能得到重点)。不检查找到A
的文档是没有意义的。此外,对于提供的查询,仍需要枚举文档上的所有匹配项以获取正确的分数。
然而,你确实提到了分数!我怀疑你真正想要的是,如果找到一个集合中的一个查询术语,不要将得分与其他元素复合。也就是说,对于(A OR B)
,分数可以是score-A
或score-B
,而不是score-A * score-B
或某些此类(如果我在这里做出错误的假设,我很抱歉,课程)。
这就是DisjunctionMaxQuery
的用途。将每个子查询添加到它将使其得分等于所有子查询的得分的最大值,而不是产品。
在Solr中,你应该了解DisMaxQParserPlugin,这是最近的化身,ExtendedDisMax,如果我接近这个标记,它应该能很好地为你服务。