solr complexphrase查询忽略AND子句

时间:2016-04-04 15:18:32

标签: solr lucene datastax

在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的所有文档。 我该怎么办?

2 个答案:

答案 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\""