【问题标题】:Lucene: converting boolean queries with ORs to ANDs onlyLucene:仅将带有 OR 的布尔查询转换为 AND
【发布时间】:2017-07-14 10:10:02
【问题描述】:

我只需要将带有 AND、OR 和 NOT 的布尔查询转换为 AND 和 NOT。我所有的 OR 都需要转换为 AND,显然保持原意。

例如:

a AND b AND (c OR d OR e)

应该转换成几个单独的查询:

a AND b AND c
a AND b AND d
a AND b AND e

它具有相同的逻辑结果,但它没有使用 OR。 我尝试了很多不同的方法,但还没有真正的解决方案。 我知道我也许可以使用一些德摩根定律,但还没有找到解决方案。

请务必注意,我需要转换任何类型的查询,而不仅仅是我的示例中的那个。我必须真正涵盖这一切。 作为其他示例(逗号表示另一个查询):

a OR b > a, b
a AND (b OR c) > a AND b, a AND c
a OR (b AND (c OR d)) > a, b AND c, b AND d
...

谢谢!

编辑: 更清晰的例子:

lucene AND (solr OR hadoop) > lucene AND solr, lucene AND hadoop
stackoverflow AND (java OR lucene) -solr > stackoverflow AND java -solr, stackoverflow AND lucene -solr

【问题讨论】:

    标签: java solr lucene logic boolean-logic


    【解决方案1】:

    听起来您需要将搜索表达式转换为disjunctive normal form。那么析取的每一个词都可以作为一个单独的搜索,并将搜索结果组合起来。

    尝试在谷歌上搜索“转换为析取范式”以获取流程和示例。

    【讨论】:

      【解决方案2】:

      当你遇到一个

      E = a OR b 
      

      然后您可以将 OR 运算转换为 NOT 的 AND

      E = NOT NOT E 
      E = NOT NOT (a OR b)
      E = NOT (NOT a AND NOT b)
      

      所以你的例子将被转换如下:

      E = a AND b AND (c OR d OR e) 
      E = a AND b AND NOT NOT (c OR d OR e) 
      E = a AND b AND NOT (NOT c AND NOT d AND NOT e)
      

      【讨论】:

      • 在布尔逻辑意义上,它可以工作,但在我的实际使用中,即布尔搜索,它不会。例如,我需要在 Facebook 上搜索 AND (b OR c),它只接受 AND,因此“NOT a”不是搜索查询。在一个真实的例子中,查询“lucene AND (solr OR hadoop)”,我无法搜索“-lucene”等等,明白了吗?
      • 哦,我明白了,我明白了
      猜你喜欢
      • 2012-04-08
      • 2013-09-08
      • 2023-03-19
      • 2013-12-10
      • 2010-10-31
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多