簡體   English   中英

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

[英]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)))

這里的想法是選擇ACMEHDFCICICI中有currentcompany所有文檔,而不是AIRTEL

無需指定非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等於AIRTEL 但是currentcompany ,這沒有任何意義,因為您已經選擇了允許的currentcompany列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM