1

在 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,有一些不成文的规则和不明显的缺陷,尤其是在布尔查询中使用否定。

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

4

1 回答 1

1

你的查询对我来说很好。

lucene/solr 中的ANOT用于过滤掉结果,并不意味着匹配其他所有内容,例如在数据库中(嗯,有时它在 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 样式布尔逻辑不同的更多解释,请在此处查看我的答案

于 2017-05-12T21:14:19.113 回答