2013-06-20 64 views
6

以下過濾查詢返回結果爲零(使用*:*爲查詢):這個Solr範圍過濾器查詢有什麼問題?

-startDate:[* TO *] OR startDate:[* TO NOW/DAY+1DAY] 

但如果我只篩選:

-startDate:[* TO *] 

我得到3個結果。

如果我只篩選:

startDate:[* TO NOW/DAY+1DAY] 

我得到161個reults。

爲什麼組合的FQ返回零結果?我想要的是過濾器返回任何開始日期爲空或開始日期是在今天之前的文檔。

編輯:

我使用Solr的4.2.1.2013.03.26.08.26.55

編輯:

好吧,怪它聽起來同事建議把括號上這兩個部分是這樣的:

(-startDate:[* TO *]) OR (startDate:[* TO NOW/DAY+1DAY]) 

並以某種方式它的工作。我仍然很好奇爲什麼這有所作爲。希望有人能夠闡明一些看法。

謝謝!

+0

它可能與http://stackoverflow.com/questions/634765/using-or-and-not-in-solr-query .... – jmend

+0

可能重複[搜索日期範圍或null/no字段在Solr](http://stackoverflow.com/questions/1343794/searching-for-date-range-or-null-no-field-in-solr) –

回答

6

Solr支持純負查詢。他們這樣做,實際上,通過擴大純負面的東西,如:

*:* -startDate:[* TO *] 

不過,你在BooleanQuery結合起來,我不相信它了適用這種邏輯的。在lucene中,否定查詢不會獲取任何內容,而是會過濾掉其他正面查詢條件引入的匹配項。這與SQL查詢有所不同,從某種意義上講,它始於一個隱含的*:*或一個完整的結果表,並允許您將其刪除。

我相信你的OR被有效地忽略了,因爲嚴格來說,它並沒有在上下文中有意義。一般來說,OR只是語法糖,我相信(field:this OR field:that相當於field:this field:that)。

因此,實際上您的查詢是:startDate:[* TO NOW/DAY+1DAY] -startDate:[* TO *],這使您看到的結果更加明顯。當你用圓括號包裝它時,每個術語查詢都被分開處理,並且你可以訪問solr支持孤獨的負面查詢。


如果您需要搜索unset/null值,一個更好的辦法是存儲默認值。 *:*並且通過擴展這樣的純粹否定查詢必須掃描整個索引,因此執行得非常差。提供默認值會提高性能,並防止這種混亂的情況。

+0

我認爲這是發生了什麼事。 A做了一個「調試」查詢,它被翻譯成startDate:[* TO NOW/DAY + 1DAY] -startDate:[* TO *],這確實沒有意義。我認爲默認值是理想的,但對於null的支持僅僅是臨時的,而索引再次被填充(使用非空值)。 – jmend

-1

純粹的否定查詢不起作用,因爲它們沒有任何結果。

嘗試:

和-startDate:[*到*]

+1

請注意,我試圖找出一個過濾器查詢(fq參數),所以負面查詢應該可以正常工作。 – jmend

-1

當你與-startDate:[* TO *]查詢你不具備的startDate領域的任何數據文件。

當您查詢startDate:[* TO NOW/DAY+1DAY]時,您會在startDate字段中獲得的值小於或等於NOW/DAY+1DAY的文檔。您可以試試-startDate:* OR startDate:[* TO NOW/DAY+1DAY]。第一部分表示沒有價值的文檔,第二部分表示文檔在startDate字段中的值小於或等於NOW/DAY+1DAY

+1

似乎-startDate:*表現爲-startDate:[* TO \ *]。我的意思是,如果我將fq設置爲-startDate:\ *,我會得到3個結果。如果我將fq設置爲-startDate:*或startDate:[\ * TO NOW/DAY + 1DAY],我再次得到零。 – jmend

0

我用femtoRgon's answer並能夠構建一個包含範圍和空白值的查詢。

以下內容包括2014年1月1日或之後的StartDate以及所有沒有StartDate的文檔。

(StartDate:[2014-01-01T00:00:00Z TO *]) OR (-StartDate:([* TO *]) AND *:*) 

魔法是(-StartDate:([* TO *]) AND *:*)。這將選擇沒有StartDate的文檔。