我认为复杂短语查询解析器不支持AND 语法。 ORs 使用 SpanOr。 Lucene 中没有等效的 SpanAnd。
即使SpanAnd 确实存在,我也觉得它的含义可能与您的预期不同。 OR 用于匹配同一位置的一个或另一个。也就是说,(A OR B) C 匹配“A C”和“B C”。因此,这个理论上的 SpanAnd (A AND B) C 必须让 A 和 B 在 C 之前的相同位置。可能有两个术语在索引中占据相同的空间(使用词干分析器、同义词过滤器等),但直接搜索通常不是特别有趣。
要实现您正在寻找的东西,您可能需要使用以下内容:"a b d"~1000 "c d"~1000
通过 Lucene SpanQuery API(大致)可以按照您编写的方式表达此查询:
SpanQuery abQuery = new SpanNearQuery(new SpanQuery[] {
new SpanTermQuery(new Term("field", "a")),
new SpanTermQuery(new Term("field", "b"))
}, 1000, true);
SpanQuery cQuery = new SpanTermQuery(new Term("field", "c"));
SpanQuery abcQuery = new SpanOrQuery(new SpanQuery[] {
abQuery,
cQuery
});
Query finalQuery = new SpanNearQuery(new SpanQuery[] {
abcQuery,
new SpanTermQuery(new Term("field", "d"))
}, 1000, true);
TopDocs docs = searcher.search(finalQuery, 10);
不过,我不相信 ComplexPhrase 解析器完全能够表达它。这涉及嵌套的 SpanNears,我不相信解析器支持。