Solr FilterQuery-在查询中使用AND和NOT



solr云中的文档类似

{
currentcompany : ACME; //text_general
previouscompanies : Infosys, Hexaware; // text_general multivalued
post: some string here //text_general probably irrelevant but could be 
used to replicate my schema. this is the default field
}

当传递类似的查询时

{
q = *:*;
fq = {!cache=false}((currentcompany:((ACME OR HDFC OR ICICI) 
AND (!AIRTEL))) OR (previouscompanies:((LCMS OR HEXAWARE) AND (!LOMBARD))));
}

我得到的结果是空的。有人能帮我理解为什么会这样吗?

更多信息:

df:post//默认字段。这是一个text_general。当通过其中任何一个时,我得到的结果是:

{
q = *:*;
fq = {!cache=false}((currentcompany:((ACME OR HDFC OR ICICI) 
AND (!AIRTEL))) OR (previouscompanies:((LCMS OR HEXAWARE))));
} //removed  AND (!LOMBARD)

{
q = *:*;
fq = {!cache=false}((currentcompany:((ACME OR HDFC OR ICICI)
OR (previouscompanies:((LCMS OR HEXAWARE) AND (!LOMBARD))));
} //removed AND (!AIRTEL)))

编辑:对不起。字段为当前公司&以前的公司。

更新:以下查询适用于

{!cache=false}((currentcompany:((ACME OR HDFC OR ICICI) 
AND !(AIRTEL))) OR (previouscompanies:((LCMS OR HEXAWARE) 
AND !(LOMBARD)))); //Used the not operator outside the bracket

解决了我的问题,但仍然很好奇为什么以前的格式不起作用。

QueryParser是edismax。

让我们谈谈您的正确查询的第一部分:

(currentcompany:((ACME OR HDFC OR ICICI) AND !(AIRTEL)))

这里的想法是在ACMEHDFCICICI中选择具有currentcompany但不具有AIRTEL的所有文档。

不需要指定非AIRTEL部分,您已经指定了允许值的列表(顺便提一下,它不包括AIRTEL)。

现在我必须做一个重要的前提,当您在Solr过滤器查询中使用AND运算符时,选择两组文档之间的交集。

因此,让我们再次尝试只接受错误查询的第一部分:

(currentcompany:((ACME OR HDFC OR ICICI) AND (!AIRTEL)))

在这里,您尝试将两个集合相交,前者是文档集,其中currentcompany位于ACMEHDFCICICI中,而后者是空集。

集合和空集之间的交集总是返回一个空集,这就是Solr不返回任何文档的原因。

当你在括号内使用NOT运算符时,你有一个空集,这是因为

Solr只检查顶级查询是否为纯负数查询

https://wiki.apache.org/solr/NegativeQueryProblems

因此,您不能以这种方式在方括号中使用NOT运算符,您应该尝试使用(*:* AND NOT AIRTEL),该集合不为空,并选择所有currentcompany不等于AIRTEL的文档。但是如前所述,这毫无意义,因为您已经选择了允许的currentcompany的列表。

最新更新