2012-04-19 103 views
3

我有一個文件是這樣的:
<doc>
<arr name="StartDate">
<date>2012-08-18T17:00:00Z</date>
<date>2012-06-28T17:00:00Z</date>
<date>2013-02-28T17:00:00Z</date>
<date>2012-04-16T17:00:00Z</date>
<date>2012-08-06T17:00:00Z</date>
<date>2012-05-18T17:00:00Z</date>
<date>2012-07-04T17:00:00Z</date>
</arr>
<arr name="EndDate">
<date>2012-09-29T17:00:00Z</date>
<date>2012-06-29T17:00:00Z</date>
<date>2013-04-16T17:00:00Z</date>
<date>2012-05-07T17:00:00Z</date>
<date>2012-08-15T17:00:00Z</date>
<date>2012-06-22T17:00:00Z</date>
<date>2012-08-01T17:00:00Z</date>
</arr>
</doc>
查詢多值字段在Solr的

我有日期範圍,並希望找到一對起始日期的日期和結束日期覆蓋範圍。例如,如果輸入範圍(x,y)爲2012-08-18 < x和2012-09-29 > y,則第一對startDate和EndDate(2012-08-18 TO 2012-09-29)返回true。

我寫這樣的查詢:
開始日期:[1995-12-31T23:59:59.999Z TO 2012-08-18T00:00:00.000Z]日期和結束日期:2012-09-29T00:00 :00.000Z TO 2099-01-01T00:00:00.000Z]
但問題是SOLR搜索所有匹配日期中的14個項目的集合,而我只是想逐一比較它們(1與1,2與2 ...)。

請幫助告訴我該怎麼做。非常感謝。

回答

2

我有一個類似的模型,但據我所知,還沒有任何方法可以在Solr中做到這一點。

Solr中有一個「平」的指標,這意味着如果你的基礎機構是這樣的:

dates: [ 
    (start1, end1), 
    (start2, end2), 
    (start3, end3) 
] 

將被夷爲平地:

start_date: [ start1, start2, start3 ] 
end_date: [ end1, end2, end3 ] 

而且因爲是沒有關係的每個startend對,所以沒有辦法對它們進行範圍查詢。爲了直接在Solr中工作,你可能必須實現一個自定義的Solr字段類型來維護這個連接。

另一個解決方案是有一個單獨的Solr core與日期字段和主實體的id。這樣做的缺點是,您無法將日期搜索與主要實體的其他字段上的過濾功能結合使用。

+0

您的第一個解決方案。我正在考慮使用Solr'函數'查詢。只要我們可以迭代2個數組,我們就可以找到實現它的方法。只是我的想法。我對Solr很新。謝謝,等待其他答案。 – dtnam 2012-04-19 08:37:13

+0

我懷疑訂單是保證多值字段;我沒有閱讀源代碼來檢查這個問題,但它肯定有可能會以'[start2,start1,start3]'結束。 – beerbajay 2012-04-19 08:55:47

+0

我能看到的其他方法是將(start1,end1)非規範化爲一個可以搜索的值。然而這可能不是那麼容易/可能的,所有 – Fuxi 2012-04-19 11:29:22