具有多个否定的Solr查询

时间:2017-05-12 20:34:42

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

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

匹配某个文档类型的所有文档,其中:

  1. 某些短语("短语一","短语二")必须出现在要匹配的文本字段中
  2. 但如果此字段中还出现其他短语("短语3","短语4","短语5"),则不匹配。
  3. 我当前写的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作为布尔查询的一部分。

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

1 个答案:

答案 0 :(得分:1)

您的查询对我来说很好。

lucene / solr中的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