【问题标题】:Short-circuit OR operator in Lucene/SolrLucene/Solr 中的短路或运算符
【发布时间】:2013-07-22 00:40:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你已经读过这个了吗? searchhub.org/2011/12/28/why-not-and-or-and-not
  • @arun - 感谢您发布链接。它很好地概述了 solr/lucene 提供的各种运算符。但它没有回答我关于短路的问题。在我看来,模拟我想要的一种方法是编写以下查询:(x !y !z) OR (y !z !x) OR (z !x !y)。但是上一个查询的问题是,所有三个子句都被执行,而与任何子句的匹配无关(违背了 OR 运算符的目的)。
  • 我认为建议的网址已移至此处lucidworks.com/post/why-not-and-or-and-not

标签: solr lucene boolean-logic


【解决方案1】:

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

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

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

在 Solr 中,您应该了解 DisMaxQParserPlugin 以及它最近的化身 ExtendedDisMax,如果我在这里接近标记,它应该非常适合您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2015-09-26
    • 2012-08-03
    • 2011-11-13
    相关资源
    最近更新 更多