Lucene:将带有OR的布尔查询转换为仅AND

时间:2017-02-23 19:00:39

标签: java solr lucene logic boolean-logic

我需要将带有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。 我尝试了很多不同的方法,但还没有真正的解决方案。 我知道我可以使用一些De Morgan定律,但还没有找到解决方案。

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

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

2 个答案:

答案 0 :(得分:1)

听起来您需要将搜索表达式转换为disjunctive normal form。然后,每个分离项可以用作单独的搜索,并将搜索结果组合在一起。

尝试谷歌搜索“转换为析取正常形式”的流程和示例。

答案 1 :(得分:0)

每当遇到

E = a OR b 

然后你可以将OR运算转换为AND的NOTs

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)