2012-04-05 50 views
1

我正在使用SOLR並存儲銷售人員可用於訪問客戶端的日期數組(根據客戶端請求,行程可能持續一天之內的任何時間)。對於每個銷售人員,我都有一個可供銷售人員在特定月份中使用的日期列表。還有其他領域,包括銷售人員數據,地理位置信息等SOLR - 僅當範圍內的所有日期匹配時才匹配範圍查詢

我熟悉範圍查詢,但似乎SOLRs數組搜索工作方式不同於我想 - 只要數組中的任何項目是一個比賽的範圍是一場比賽)。我想向SOLR發送一個範圍的查詢,並且只有在該範圍內的所有日期都在數組中找到時才返回一個匹配。例如:

<arr name="available_dates"> 
    <date>2012-04-30T00:00:00Z</date> 
    <date>2012-05-01T00:00:00Z</date> 
    <date>2012-05-02T00:00:00Z</date> 
</arr> 

-- should match -- 
available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z] 

-- should not match as 2012-04-29 is not contained in available_dates -- 
available_dates:[2012-04-29T00:00:00.000Z TO 2012-05-02T00:00:00.000Z] 

這是可能的還是我對這一切都錯了?

+1

[此](http://lucene.472066.n3.nabble.com/query-range-in-multivalued-date-field-td2361292.html)螺紋可能會幫助你。 – Noam 2012-04-08 12:57:35

回答

0

而不是使用範圍查詢,您應該使用多個子句,每個日期一個。

所以不是available_dates:[2012-04-29T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]

您應該使用available_dates:"2012-04-29T00:00:00.000Z" AND available_dates:"2012-04-30T00:00:00Z" AND available_dates:"2012-05-01T00:00:00.000Z" AND available_dates:"2012-05-02T00:00:00.000Z"

希望這回答您的問題!

+0

對於大型日期範圍,這不是一個易處理的解決方案。由於所有檢查都是對數組中每個元素的範圍查詢進行評估,因此以這種方式構建查詢將更有效。不過好的想法。 – MrGomez 2012-04-09 00:22:03

0

你有正確的想法,但your initial query is a search instead of a match。直觀上,您的搜索available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z]內應包含available_dates的所有元素,因爲它具有匹配成功。

您有兩種選擇可以有效且成功地實現此邏輯。您可以手動或動態地爲陣列中的每個元素執行範圍查詢,也可以設置一個輔助項目,在執行搜索後嘗試執行匹配。例如:

available_dates:[2012-04-30T00:00:00.000Z TO 2012-05-02T00:00:00.000Z](available_dates)

這是說,在左到右的順序:評估範圍搜索,然後檢查所有從available_dates結果都包含在本次評測(由默認AND查詢方式) 。如果是,則返回元素。如果沒有,不要。

從句法上看,上述內容未經測試,可能不起作用。但在程序上,您應該能夠圍繞此編寫正確的查詢以適應您的需求。

Additional resource discussing the default AND behavior of composite search queries

0

假設你正在從數據庫中導入此數據。

在您的數據庫或搜索索引中,創建一個新列,用於存儲銷售人員日期的最大值(如最新日期)以及最小值。另外,計算並存儲最短日期的最大差異。

三個標準必須爲匹配查詢(因此使用並在查詢)

  1. 查詢的最大& min之間differnce不能大於差更大作爲存儲在索引

    匹配
  2. 你會確保{!FRANGE L = 0 U = difn_bet_query_max_and_min}子(FIELD_MIN,query_min)

  3. 制定的最高一回事值

有關功能的基準範圍 http://www.lucidimagination.com/blog/2009/07/06/ranges-over-functions-in-solr-14/

+0

迷人的建議。如果我正確地閱讀了這個內容,那麼我們的想法是獲取臨時表並執行高通和低通濾波,然後查看結果數據表是否與最初給出的數據表相當。這是可行的,儘管它在存儲和通行次數方面的內存和計算性能方面似乎不夠優雅。思考? – MrGomez 2012-04-12 00:00:23

+0

仍然假設你從數據庫導入。您不一定必須將銷售人員日期的最小和最大值存儲在分貝中,也可以將其存儲在lucene/solr的索引中。通過在銷售人員實體下創建另一個實體來創建另一個實體,並對當前正在處理的銷售人員運行查詢以查明該人員的最小和最大可用日期。還存儲銷售員的最大和最小日期之間的差異。對內存的要求與之前相同,但是執行更多的查詢,因此速度更慢。但現在你不需要添加列到數據庫。 – Joyce 2012-04-12 15:51:52

+0

我在這裏提出了一個類似於這個問題的問題http://stackoverflow.com/questions/9892716/choose-solr-documents-where-one-field-is-great-than-another但實際上這個人的解決方案要求大於或小於被指數化爲指數布爾值:(而不是試圖計算瓦特/範圍 – Joyce 2012-04-12 15:58:18