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

时间:2017-11-03 13:52:55

标签: solr

solr cloud中的文档就像

{
 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。

1 个答案:

答案 0 :(得分:1)

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

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

此处的想法是选择currentcompanyACMEHDFC但不ICICIAIRTEL的所有文档。

无需指定非AIRTEL部分,您已经指定了允许值列表(顺便提到不包含AIRTEL)。

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

再说一次,让我们尝试只采用错误的查询的第一部分:

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

这里你试图交叉两个集合,前者是currentcompanyACMEHDFCICICI中的文档集合,后者是空集。

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

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

  

Solr仅检查顶级查询是否为纯负值   查询

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

所以你不能以这种方式在括号旁边使用NOT运算符,你应该尝试使用(*:* AND NOT AIRTEL),这些集合不为空,并选择所有没有currentcompany的文档等于{{ 1}}。但如上所述,这没有任何意义,因为您已经选择了允许的AIRTEL列表。