solr - solr 查询字符串中的负运算符(NOT,- , !)不适用于括号

标签 solr solr-query-syntax

我正在使用 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/

相关文章:

java - 如何使用 solrj 4.9.0 提取统计组件

search - 在 Solr 中搜索确切短语时,是否可以包含停用词?

hadoop - Solr-发布数据时出现IO异常:java.net.ConnectionException

http - Solr 通过 HTTP 上的游标将文档获取为 CSV

php - 使用 SOLR 和 PHP 通过用户名和名称搜索查找用户的关注者

Solr 精确匹配提升 减少结果

search - Solr高亮

Tomcat & Solr - 如果 solrconfig.xml 或其他 conf 文件被修改,我是否需要重新生成 solr.war?

solr - 如何在 solr 嵌套查询语法中转义引号?

solr - 如何使用类似于 rdbms 子查询的 Solr 子查询?