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" 以获取流程和示例。
我需要将包含 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" 以获取流程和示例。