【问题标题】:solr complexphrase query ignoring AND clausessolr complexphrase 查询忽略 AND 子句
【发布时间】:2016-07-24 05:25:30
【问题描述】:

在 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 的所有文档。 我能做什么?

【问题讨论】:

  • 您有没有看到任何文档显示这种语法(ANDOR 在一个复杂的短语中)受支持?我想我没有。
  • @femtoRgon 这不是一个文档,但我看到了这个blog post 和更官方的东西你可以找到here。第一句话是ComplexPhraseQParser 使用Lucene 的ComplexPhraseQueryParser 在短语查询中提供对通配符、OR 等的支持

标签: solr lucene datastax


【解决方案1】:

我认为复杂短语查询解析器不支持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,我不相信解析器支持。

【讨论】:

  • 您能想到用 Lucene 编写此查询的其他方法吗?
  • @ashual - 不是真的,不。 Surround 可能是另一个可以尝试的查询解析器,但它也不支持这样的嵌套。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多