2013-08-23 46 views
0

考慮:顧問的名單有間隔的名單時,他們沒有可供選擇:solr:如何用至少X天搜索日期範圍?

<consultant> 
    <id>1</id> 
    <not-available> 
     <interval><from>2013-01-01</from><to>2013-01-10</to> 
     <interval><from>2013-20-01</from><to>2013-01-30</to> 
     ... 
    </not-available> 
</consultant> 
... 

我想尋找可供至少在X天從一個特定的時間間隔顧問(!) STARTDATE到ENDDATE。

例如:顯示可用於在2013-01-01的範圍內至少5天所有顧問 - 2013年2月1日(因爲他是免費的,從2013年1月11日到2013年這將匹配顧問1 -01-19)。

  • 問題1:我的solr文檔應該如何顯示?
  • 問題2:查詢的外觀如何?

回答

1

作爲一般建議:儘可能預先計算,存儲您正在查詢的數據,而不是您獲得的數據作爲輸入。

此外,使用基於不同實體的幾個指標 - 如果你有自由這樣做,如果查詢將變得更加簡單和直接。

好的,一般性拋開你的問題。


從你的例子,我認爲你現在存儲在索引如果顧問不可用 - 可能,因爲這是你作爲輸入。但是你想要查詢的是它們何時可用。所以,你應該考慮存儲可用性,而不是不可用性。

編輯: 查詢這個最直接的方法是使用間隔作爲實體,這樣你就不必訴諸特殊的SOLR特徵來查詢兩個多值域上的間隔的開始和結束。

一旦存儲的可用性的時間間隔也可以預先計算和存儲他們的長度:

<!-- id of the interval --> 
<field name="id" type="int" indexed="true" stored="true" multiValued="false" /> 
<field name="consultant_id" type="int" indexed="true" stored="true" multiValued="false" /> 
<!-- make sure that the time is set to 00:00:00 (*/DAY) --> 
<field name="interval_start" type="date" indexed="true" stored="true" multiValued="false" /> 
<!-- make sure that the time is set to 00:00:00 (*/DAY) --> 
<field name="interval_end" type="date" indexed="true" stored="true" multiValued="false" /> 
<field name="interval_length" type="int" indexed="true" stored="true" multiValued="false" /> 

您的疑問:

(1)這裏,取回至少有請求的長度所有間隔:

fq=interval_length:[5 to *] 

這是一個可選步驟。您可能想要評估它是否改善了查詢性能。 此外,您還可以過濾某些consultant_ids。

(2)的基本查詢是用於間隔(使用q.alt在dismax處理程序的情況下):

q=interval_start:[2013-01-01T00:00:00.000Z TO 2013-02-01T00:00:00.000Z-5DAYS] 
    interval_end:[2013-01-01T00:00:00.000Z+5DAYS TO 2013-02-01T00:00:00.000Z] 

(爲可讀性加入換行符,查詢的兩種組分應當通過分離常規空間)

確保您始終將時間設置爲相同的值。最好是00:00:00,因爲那是/DAY所做的:http://lucene.apache.org/solr/4_4_0/solr-core/org/apache/solr/util/DateMathParser.html。 值越小,緩存越好。


更多信息: http://wiki.apache.org/solr/SolrQuerySyntax - Solr的範圍查詢 http://wiki.apache.org/solr/SolrCaching#filterCache - fq過濾器的緩存結果


編輯:

qfq參數

更多信息:

http://wiki.apache.org/solr/CommonQueryParameters 它們在緩存時處理方式不同。這就是爲什麼我添加了其他鏈接(見上文),首先。使用fq作爲您期望經常在查詢中看到的過濾器。您可以組合多個fq參數,而每個請求只能指定q一次。

我該如何「根據不同實體使用多個索引」?

看一看多核功能:http://wiki.apache.org/solr/CoreAdmin

難道是矯枉過正,以保存每個可用天:日期; num_of_days_to_end_of_interval - 應該讓查詢更簡單?

取決於您在這種情況下需要多少數據。我也不確定它會真正幫助你發佈你的查詢。日期範圍查詢非常靈活和快速。你不需要避免它們。只要確保指定的時間儘可能寬,以允許緩存。

+0

目前爲止很好的回答。不幸的是,我對Solr很新穎(但是我有Lucene的經驗)並且有一些初學者的問題:q和fq有什麼區別?我怎樣才能「基於不同的實體使用多個索引」?我通過節省可用時間與你在一起!保存每個可用的日期是否過分:date; num_of_days_to_end_of_interval - 應該使查詢更簡單? – Marcel

+0

我已經編輯了答案以迴應您的評論。 – Risadinha