我正在使用 solr 6.6.0 ,这里是集合中的文档。
{"id":1,"content":test1"}
{"id":2,"content":test2"}
{"id":3,"content":test3"}
假设我想包含不包含“test1”和“test2”的文档,按照Grouping Terms to Form Sub-Queries,按照以下方式编写查询字符串似乎是合法的引用指南的部分。
content:((NOT "test1") AND (NOT "test2"))
查询的结果是预期仅返回文档 #3,但实际结果为空。
或者,如果将上述查询更改为以下查询,“NOT 表达式”周围没有括号,则返回预期结果。
content:(NOT "test1" AND NOT "test2")
我的问题是,为什么第一个查询字符串不能以预期的方式工作?
最佳答案
Solr 当前检查“纯否定”查询并插入 *:*
(匹配所有文档)以便后一种格式(不带括号)正常工作。
请参阅以下来自 org.apache.solr.search.QueryUtils.java 的代码片段
/** Fixes a negative query by adding a MatchAllDocs query clause.
* The query passed in *must* be a negative query.
*/
public static Query fixNegativeQuery(Query q) {
BooleanQuery newBq = (BooleanQuery)q.clone();
newBq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
return newBq;
}
所以
NOT "test"
被solr转换成(*:* NOT "test")
但是 Solr 只检查顶级查询,所以这意味着像
(NOT "test1")
这样的查询未更改,因为纯否定查询不在顶层。这就是前一种格式(带括号的格式)不能按预期工作的原因。
所以,我们大致可以得出结论:正确的使用方法
NOT
运算符是 (*:* NOT some_expression)
形式,而不是单个 NOT some_expression
.
关于solr - solr 查询字符串中的负运算符(NOT,- , !)不适用于括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523663/