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

Lucene: converting boolean queries with ORs to ANDs only

我需要将包含 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
Whosebug AND (java OR lucene) -solr > Whosebug AND java -solr, Whosebug AND lucene -solr

每当你遇到

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)

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

尝试谷歌搜索 "convert to disjunctive normal form" 以获取流程和示例。