2015-11-30 51 views
1

我有一個行爲意外的SOLR搜索。當我進入SOLR管理並運行以下搜索時,出現奇怪的行爲(請注意,myField__s只有2個可能的值,MyValue1MyValue2)。SOLR/Lucene方面查詢 - OR和NOT

// 13,461 found - Good 
fq: 

// 9,168 found - Good 
fq: myField__s:"MyValue1" 

// 4,293 found - Good 
fq: NOT myField__s:"MyValue1" 

// 0 found - Bad, expected 13,461 
fq: myField__s:"MyValue1" OR NOT myField__s:"MyValue1" 

// 9,168 found - Good 
fq: myField__s:"MyValue1" OR NOT myField__s:"MyValue2" 

// 9,168 found - Bad, expected 13,461 
fq: myField__s:"MyValue1" OR (NOT myField__s:"MyValue1") 

我覺得我有一些很大的東西我失蹤fq語法。任何人都可以提供指導嗎?

+0

你最後的結果有點出人意料對我來說。我曾想過Solr處理這種情況。仍然,[這個答案](http://stackoverflow.com/questions/17221736/whats-wrong-with-this-solr-range-filter-query/17225534#17225534)可能會指出你在正確的方向,爲什麼不是Solr中的查詢可能有點難以預測。 – femtoRgon

+0

我想我明白了,但是'(myField__s:「MyValue1」)OR(NOT(myField__s:「MyValue1」))'通過SOLR轉換爲'myField__s:MyValue1(-myField__s:MyValue1)'。閱讀事情和你發佈的答案讓我覺得這應該起作用。 2個「主要」組件沒有+或 - 所以它們應該是一個應該的。內部部分應該採取整套和刪除任何匹配「MyValue1」。那麼這兩個SHOULDs應該整合在一起。沒有? –

+1

是的,這對我來說也是令人驚訝的。如果您手動添加全部匹配,您可能會有一些運氣。例如:myField__s:MyValue1(*:* -myField__s:MyValue1)' – femtoRgon

回答

1

Solr有布爾搜索的自由選項必須,應該和MUST_NOT。如果在某個術語之前包含NOT前綴,那麼這意味着您將它添加到帶有MUST_NOT選項的布爾查詢中,因此使用此術語的文檔將從搜索結果中排除。 (前綴AND變成MUST選項,前綴OR變成SHOULD OPTION)。換句話說查詢字符串

myField__s:"MyValue1" OR NOT myField__s:"MyValue1" 

會被解析成

myField__s:"MyValue1" -myField__s:"MyValue1". 

你可以看到Solr的響應FQ領域的轉換後的查詢

{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":11, 
    "params":{ 
     "debugQuery":"true", 
     "indent":"true", 
     "q":"some query", 
     "wt":"json", 
     "fq":"myField__s:MyValue1 -myField__s:MyValue1"], 
...... 
+0

謝謝。出於某種原因,我們的SOLR管理員不顯示'params'。你知道正確的方式來實現我想要的嗎? –

+0

嘗試向查詢請求添加&debugQuery = true,這將在響應結束時顯示解析器查詢。但它只適用於q,而不適用於fq。 –

+1

這是幫助,但仍試圖找出它 - http://lucidworks.com/blog/2011/12/28/why-not-and-or-and-not/ –