solr复杂短语查询忽略AND子句

solr complexphrase query ignoring AND clauses

在 Solr (4.10) 中使用复杂短语解析器时,我正在尝试 运行 这个查询:((a AND b) OR c) AND 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 的文档。 我能做什么?

我认为复杂短语查询解析器不支持 AND 语法。 ORs 使用 SpanOr。 Lucene 中没有等价物SpanAnd

即使 SpanAnd 确实存在,我感觉它的含义可能与您预期的不同。 OR 用于在相同位置 匹配一个或另一个 。也就是说,(A OR B) C 匹配 "A C" 和 "B C"。因此,这个理论上的 SpanAnd (A AND B) C 必须将 A 和 B 都放在同一位置,就在 C 之前。可以有两个术语在索引中占据相同的 space(使用词干分析器,同义词过滤器等),但直接搜索通常不是特别有趣。

要实现您的目标,您可能需要使用以下内容:"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,我认为解析器不支持它。

试试这个: _query_:"{!complexphrase}title:\"A\"" AND _query_:"{!complexphrase}title:\"B\""