2014-03-27 34 views
0

嵌套搜索我有一個活動模式和ActivityOccurrence模型,其中Activity has_many :activity_occurrencesSolr中

Activity:這種模式將對所有ActivityOccurrence

AcitvityOccurrence所需的元數據:ATTRS - 發生(日期時間)完成。

現在我們有了新的要求,即當用戶搜索特定範圍內的活動時,必須在搜索結果中顯示所有活動。

此前我們曾經在重複活動的情況下只顯示一條記錄。

因此,根據新要求,我們決定將搜索從Activity移至ActivityOccurrence。現在

,我不希望指數Activity在我的每個ActivityOccurrence的元信息作爲我的活動有10場以上ActivityOccurrence

如: 如果我有然後我會將1000 AcitivityOccurrence記錄中的所有活動信息編入索引。

爲應用程序的增長,如果我們的索引這樣

因此,我主要關心的是我必須做的索引量這將需要巨大的空間。

所以我想在ActivityOccurrence,以避免活動指數。

那麼有沒有一種方法可以首先根據其過濾器搜索活動,然後在基於活動結果的範圍內搜索ActivityOccurrence

注意:我們也沒有結束髮生。

任何想法?

在此先感謝。

回答

0

除非你處理數百萬個活動/發生,否則這可能是一個不成熟的優化 - 空間便宜,SOLR速度快。換個角度來看,你是否考慮過僅僅索引與每個活動有關的活動發生的列表(使用回調來確保它被更新)?如果沒有關於數據訪問模式的更多信息,很難真正優化,但是我從來都不是做了比必要的更多往返的粉絲。

也就是說,雖然我不知道如何寫一個純粹的SOLR查詢要做到這一點,你可以用太陽黑子做到這一點很容易地:

確保ActivityOccurenceActivity易於搜索(由活性,即ID)。

爲所需的元數據搜索Activity,並用它來提取的ID是相關的:

search = Activity.solr_search {<some block that does what you want>} 
activity_ids = search.hits.map { |hit| hit.primary_key.to_i } 

現在你可以用參數添加到您的ActivityOccurence搜索塊:

with(:activity_id, activity_ids) 

這將限制搜索的出現爲這些活動。請注意,通過這種方式您可以獲得索引效率的搜索時間性能。