具有多个否定的 Solr 查询

Solr query with multiple negations

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

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

  1. 某些短语("phrase one"、"phrase two")必须出现在要匹配的文本字段中
  2. 但如果其他词组("phrase three"、"phrase four"、"phrase five")也出现在该字段中,则不匹配。

我当前编写的 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 作为布尔查询的一部分。

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

我觉得你的查询没问题。

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