2014-08-29 52 views
1

我正在爲我們的網站開發產品過濾器,並遇到了有關使用「facet.missing = true」的一些困難。使用solr查找缺失值的消極方面查詢時遇到問題

我知道我應該使用像「fq = -facetField:[* TO *]」這樣的查詢過濾器來將結果過濾爲缺少該字段的產品。

我已經爲我的應用程序的全局過濾器輔助動態構建FQ參數爲所有查詢,以防止任何從基於用戶許可的過濾器基本上是這樣的(PHP)錯過了:

$params['fq'] = sprintf('((%s) AND (%s))', $custom, $system); 

其中,$系統是全球基於許可的過濾器,它可能看起來像(而不是實際的,但類似):

(isdiscontinued:0 AND ishidden:0 AND contract:3) 

$定製包含實際的過濾器查詢的用戶通過UI建設。假設筆記本藍牙過濾器的名稱爲fq_bluetooth,其值爲:否,是或缺少值。這將使最終FQ的樣子:

((-fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

但是它返回0產品,爲我送這個類別查詢。

如果我修改過濾查詢:

((fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

然後我得到的結果可能是預期未+的計數,不顧不明。

我應該如何格式化篩選器查詢以使其正常工作?

[編輯]

我可能還需要刻面結合,只有產品沒有藍牙或者沒有指定藍牙是那些可能進行篩選。因此,也許這樣的(這當然也不行):

fq_bluetooth:("No" OR -[* TO *]) 

被解析爲:

((-fq_bluetooth:[* TO *] OR fq_bluetooth:"No") AND ((isdiscontinued:0 AND ishidden:0 AND contract:3))) 

我與debugQuery上,我看到一個過濾器查詢像注意到:

fq_bluetooth:No -fq_bluetooth:[* TO *] 

我沒有看到或解析查詢 - 從我的研究FQ參數查詢不履行或運算符(?)。

也許OR正在工作,但由於否定查詢本身似乎失敗了,也許這就是爲什麼我看不到OR在這樣結合時工作的原因。

回答

4

刪除不必要的括號並將過濾器查詢拆分爲兩個過濾器查詢,一個用於系統限制,另一個用於用戶生成的過濾。

1)既然您想滿足您的請求中的兩個邏輯要求(安全限制和用戶生成的過濾),爲什麼不用兩個過濾器查詢重寫您的查詢呢?

一個用於系統的權限,另一種用於從你的應用程序的用戶界面生成的查詢(轉義忽略):

... FQ = isdiscontinued:0 AND是否隱藏:0和合同:3個& FQ = -fq_bluetooth :[*到*]

這甚至filter query caching

2)對於特定的查詢問題上需要幫助,通過實驗,似乎括號的存在改變了預期的效果。與本地實例做測試,我有以下的,如果我用你的語法,((-ProcedeImageElectronique:[* TO *]) AND (Pays:France AND GrandeCategorie:FILM))返回0結果:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": "((-ProcedeImageElectronique:[* TO *]) AND (Pays:France AND GrandeCategorie:FILM))" 
    } 
    }, 
    "response": { 
    "numFound": 0, 
    "start": 0, 
    "maxScore": 0, 
    "docs": [] 
    } 
} 

對戰-ProcedeImageElectronique:[* TO *] AND Pays:France AND GrandeCategorie:FILM導致預期的行爲:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": "-ProcedeImageElectronique:[* TO *] AND Pays:France AND GrandeCategorie:FILM" 
    } 
    }, 
    "response": { 
    "numFound": 1733, 
    "start": 0, 
    "maxScore": 1, 
    "docs": [...] 
    } 
} 

同樣地,使用兩個過濾查詢返回預期的結果:

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "facet": "off", 
     "indent": "true", 
     "q": "*:*", 
     "wt": "json", 
     "fq": [ 
     "-ProcedeImageElectronique:[* TO *]", 
     "GrandeCategorie:FILM AND Pays:France" 
     ] 
    } 
    }, 
    "response": { 
    "numFound": 1733, 
    "start": 0, 
    "maxScore": 1, 
    "docs": [...] 
    } 
} 

編輯:this post清楚地解釋了爲什麼用括號可能導致UNEX結果。引述:

如果頂級BoolenQuery包含某處它的嵌套 BooleanQuery只包含否定裏面的條款,即嵌套查詢 不會被修改,並且它(顧名思義)an't匹配任何文件 - 如果需要,則表示外部查詢不匹配。

+0

感謝您的迴應qux!我設法試圖讓我的查詢如下所示:fq = -fq_bluetooth:[* TO *]&fq =(isdiscontinued:0 AND ishidden:0 AND contract:3)(順便說一下,系統過濾器還有更多的組件, ORed元素)。當查詢工作時,它會失敗,當我想添加多個條件:fq = fq_bluetooth :(「否」或 - [* TO *])&fq =(isdiscontinued:0 AND ishidden:0 AND contract:3) – Chris 2014-09-04 14:13:47

+0

你有沒有嘗試沒有parenteshis?即fq = fq_bluetooth:「否」或 - [* TO *] – qux 2014-09-05 19:09:16

+0

問題是否定條款。嘗試像這樣:'fq = fq_bluetooth:否OR(-fq_bluetooth:[* TO *] *:*)'這適用於我。因此,無論何時您想匹配缺少的值,請在您的應用查詢生成器中使用'(-fieldname:[* TO *] *:*)' – qux 2014-09-05 19:36:43