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。
答案 0 :(得分:1)
让我们谈谈您正确查询的第一部分:
(currentcompany:((ACME OR HDFC OR ICICI) AND !(AIRTEL)))
此处的想法是选择currentcompany
,ACME
,HDFC
但不ICICI
中AIRTEL
的所有文档。
无需指定非AIRTEL
部分,您已经指定了允许值列表(顺便提到不包含AIRTEL
)。
现在我必须做一个重要的前提,当你在Solr过滤器中使用AND
运算符时,想要选择两组文档之间的交集。
再说一次,让我们尝试只采用错误的查询的第一部分:
(currentcompany:((ACME OR HDFC OR ICICI) AND (!AIRTEL)))
这里你试图交叉两个集合,前者是currentcompany
在ACME
,HDFC
,ICICI
中的文档集合,后者是空集。
集合和空集之间的交集总是返回一个空集,这就是Solr不返回任何文档的原因。
当你在括号内使用NOT运算符时,你有一个空集,这是因为
Solr仅检查顶级查询是否为纯负值 查询
https://wiki.apache.org/solr/NegativeQueryProblems
所以你不能以这种方式在括号旁边使用NOT运算符,你应该尝试使用(*:* AND NOT AIRTEL)
,这些集合不为空,并选择所有没有currentcompany
的文档等于{{ 1}}。但如上所述,这没有任何意义,因为您已经选择了允许的AIRTEL
列表。