如何使用OR组合两个Lucene查询?

dmn*_*dmn 6 java lucene

我想在两个名为"a"和"b"的字段中搜索我的索引.我给了搜索Freud -- theories of psychology,我想执行以下查询:

(a="Freud" AND b="theories of psychology") OR (b="Freud" AND a="theories of psychology")
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?到目前为止,我让Lucene构建了两个(firstHalfsecondHalf)使用MultiFieldQueryParser,然后我将它们组合在一起

BooleanQuery combined = new BooleanQuery();
combined.add(firstHalf, BooleanClause.Occur.SHOULD);
combined.add(secondHalf, BooleanClause.Occur.SHOULD);
Run Code Online (Sandbox Code Playgroud)

但是combined,只有找到"理论"而不是"心理学"才能返回结果,我绝对想要这两个术语.似乎Lucene将"心理学理论"分为三个词,并将它们与OR单独组合.我该如何防止这种情况?

firstHalf 好像:

Query firstHalf = MultiFieldQueryParser.parse(Version.LUCENE_33,
         new String[]{"Freud", "theories of psychology"},
         new String[]{"a", "b"},
         new BooleanClause.Occur[]{BooleanClause.Occur.MUST, BooleanClause.Occur.MUST},
         analyzer);
Run Code Online (Sandbox Code Playgroud)

哪里analyzer只是一个StandardAnalyzer对象.

dmn*_*dmn 5

我自己弄明白了,但是现在代码明显更长了;如果有人知道更优雅的解决方案,请发布,我们将很乐意回报。:)(尽管我很快将把它变成一种方法...但是这里是正在发生的事情的完整版本...)

QueryParser parser = new QueryParser(Version.LUCENE_33, "a", analyzer);
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query a_0 = parser.parse("Freud");
parser = new QueryParser(Version.LUCENE_33, "b", analyzer);
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query b_1 = parser.parse("theories of psychology");

BooleanQuery firstHalf = new BooleanQuery();
firstHalf.add(a_0, BooleanClause.Occur.MUST);
firstHalf.add(b_1, BooleanClause.Occur.MUST);

parser = new QueryParser(Version.LUCENE_33, "b", analyzer);
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query b_0 = parser.parse("Freud");
parser = new QueryParser(Version.LUCENE_33, "a", analyzer);
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query a_1 = parser.parse("theories of psychology");

BooleanQuery secondHalf = new BooleanQuery();
secondHalf.add(b_0, BooleanClause.Occur.MUST);
secondHalf.add(a_1, BooleanClause.Occur.MUST);

BooleanQuery combined = new BooleanQuery();
combined.add(firstHalf, BooleanClause.Occur.SHOULD);
combined.add(secondHalf, BooleanClause.Occur.SHOULD);
Run Code Online (Sandbox Code Playgroud)

事实证明SHOULD我的工作方式确实可行。希望有人觉得这有帮助,而我不仅仅是在公开场合对自己说话;)


Xod*_*rap 2

标准分析器将标记化。所以该查询theories of psychology相当于theories OR of OR psychology.

如果您想搜索短语“心理学理论”,请使用 PhraseQuery 否则请注意,默认的 QueryParser 会将引号解释为短语的含义(即将您的代码更改为"\"theories of psychology\"")。

是的,从某种意义上说 Lucene 不使用布尔逻辑,但它是技术性的,在这里并不真正相关。