作爲一般建議:儘可能預先計算,存儲您正在查詢的數據,而不是您獲得的數據作爲輸入。
此外,使用基於不同實體的幾個指標 - 如果你有自由這樣做,如果查詢將變得更加簡單和直接。
好的,一般性拋開你的問題。
從你的例子,我認爲你現在存儲在索引如果顧問不可用 - 可能,因爲這是你作爲輸入。但是你想要查詢的是它們何時可用。所以,你應該考慮存儲可用性,而不是不可用性。
編輯: 查詢這個最直接的方法是使用間隔作爲實體,這樣你就不必訴諸特殊的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
過濾器的緩存結果
編輯:
上
q
和
fq
參數
更多信息:
http://wiki.apache.org/solr/CommonQueryParameters 它們在緩存時處理方式不同。這就是爲什麼我添加了其他鏈接(見上文),首先。使用fq
作爲您期望經常在查詢中看到的過濾器。您可以組合多個fq
參數,而每個請求只能指定q
一次。
我該如何「根據不同實體使用多個索引」?
看一看多核功能:http://wiki.apache.org/solr/CoreAdmin
難道是矯枉過正,以保存每個可用天:日期; num_of_days_to_end_of_interval - 應該讓查詢更簡單?
取決於您在這種情況下需要多少數據。我也不確定它會真正幫助你發佈你的查詢。日期範圍查詢非常靈活和快速。你不需要避免它們。只要確保指定的時間儘可能寬,以允許緩存。
目前爲止很好的回答。不幸的是,我對Solr很新穎(但是我有Lucene的經驗)並且有一些初學者的問題:q和fq有什麼區別?我怎樣才能「基於不同的實體使用多個索引」?我通過節省可用時間與你在一起!保存每個可用的日期是否過分:date; num_of_days_to_end_of_interval - 應該使查詢更簡單? – Marcel
我已經編輯了答案以迴應您的評論。 – Risadinha