![](/img/trans.png)
[英]Solr/ElasticSearch - Document lookup by ID -> query or filterQuery?
[英]Solr FilterQuery - using AND and NOT in a query
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。
讓我們談談您正確查詢的第一部分:
(currentcompany:((ACME OR HDFC OR ICICI) AND !(AIRTEL)))
這里的想法是選擇ACME
, HDFC
, ICICI
中有currentcompany
所有文檔,而不是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
等於AIRTEL
。 但是currentcompany
,這沒有任何意義,因為您已經選擇了允許的currentcompany
列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.