具有多个否定的 Solr 查询
Solr query with multiple negations
在 Solr 6.5.1 上,我有一个 *_txt_en
字段和一个 string
文档类型字段。在这些字段上,我想构建以下形式的查询:
匹配特定文档类型的所有文档,其中:
- 某些短语("phrase one"、"phrase two")必须出现在要匹配的文本字段中
- 但如果其他词组("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
在 Solr 6.5.1 上,我有一个 *_txt_en
字段和一个 string
文档类型字段。在这些字段上,我想构建以下形式的查询:
匹配特定文档类型的所有文档,其中:
- 某些短语("phrase one"、"phrase two")必须出现在要匹配的文本字段中
- 但如果其他词组("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