【问题标题】:Solr query with multiple negations具有多个否定的 Solr 查询
【发布时间】:2017-10-12 06:22:35
【问题描述】:

在 Solr 6.5.1 上,我有一个 *_txt_en 字段和一个 string 文档类型字段。在这些字段上,我想构建一个表单的查询:

匹配特定文档类型的所有文档,其中:

  1. 某些短语(“短语一”、“短语二”)必须出现在要匹配的文本字段中
  2. 但如果其他短语(“短语三”、“短语四”、“短语五”)也出现在此字段中,则不要匹配。

我当前编写的 Solr 查询如下所示:

(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT field:"phrase three" AND NOT field:"phrase four" AND NOT field:"phrase five"

我能想到的另一种选择是:

(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT (field:"phrase three" OR field:"phrase four" OR field:"phrase five")

上述查询似乎适用于几个示例的玩具数据集。但我了解到,使用 Solr,有一些不成文的规则和不明显的缺陷,尤其是 negations 作为布尔查询的一部分。

对于我描述的查询,这是形成它们的正确语法吗?

【问题讨论】:

    标签: solr lucene full-text-search information-retrieval booleanquery


    【解决方案1】:

    您的查询对我来说很好。

    lucene/solr 中的 NOT 用于过滤结果,并且 not 是否暗示匹配其他所有内容,例如在数据库中(嗯,有时在 solr 中)。思考 lucene 中的否定如何工作的一种简单方法是假设它们前面总是有一个 AND

    • term1 OR NOT term2 实际上会得到term1 AND NOT term2 的结果
    • NOT term1 在 lucene 中不起作用,因为 AND NOT term1 没有意义。 (solr 将通过自动将其转换为 *:* AND NOT term1 来完成这项工作,因此为什么 solr 对 NOT 的处理有点不一致)
    • term1 AND (NOT term2) 不起作用,因为它会先评估 AND NOT term2,然后再转到括号外的部分(我认为 solr 不能纠正这个问题,但不要引用我的话)

    关于它为何不同于 DB 风格的布尔逻辑的更多解释,请查看my answer here

    【讨论】:

    • 是否有任何理由将我的 AND NOT 字段:"phrase three" ... 部分转换为 *:* AND NOT field:"phrase three", *:* AND NOT字段:您提到的“第四阶段”?
    • @tkja - 不,绝对不是。 *:* 是一个 match-all-docs 子句。看起来您从一组要匹配的文档开始,并从该集合中过滤掉一些东西,这就是 lucene 中设计的否定。向其中添加一堆匹配项会弄乱您获得的一组文档,并使其速度变慢。
    • @tkja - 您的替代方案也应该可以正常工作。如果它看起来像 x AND (NOT (y)),你会遇到问题的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多