在Solr 6.5.1上,我有一个*_txt_en
字段和一个string
文档类型字段。在这些字段中,我想构建一个表单的查询:
匹配某个文档类型的所有文档,其中:
我当前写的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作为布尔查询的一部分。
对于我所描述的查询,这是形成它们的正确语法吗?
答案 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