在Solr(4.10)中使用复合词解析器时,我尝试运行此查询:((a AND b)或c)和D.
顺序很重要,(A和B)或C应出现在D之前。
这是我的查询 - {!complexphrase inOrder=true}title:"((a AND b) OR c) d"~1000
。
问题是Solr威胁第一个AND为OR,并返回标题为(a OR b OR c) AND d
的所有文档。
我该怎么办?
答案 0 :(得分:1)
我不相信复杂词组查询解析器中支持AND
语法。 OR
使用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,我不相信解析器支持。
答案 1 :(得分:0)
尝试:
_query_:"{!complexphrase}title:\"A\"" AND _query_:"{!complexphrase}title:\"B\""