gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:46:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com