我有一个活动模型和活动发生模型,其中Activity has_many :activity_occurrences
Activity
:此模型将包含ActivityOccurrence
所需的所有元数据
AcitvityOccurrence
: attrs - occurrence(datetime), completed.
现在我们有了新的要求,当用户搜索特定范围内的活动时,我们必须在搜索结果中显示所有出现的活动。
以前,我们只显示一条记录,以防重复活动。
因此,根据新的要求,我们决定将搜索从Activity
移动到ActivityOccurrence
。
现在,我不想索引Activity
的元信息在我的每个ActivityOccurrence作为我的活动有10个字段比ActivityOccurrence
,
如:如果我有Activity
和1000个AcitivityOccurrence
,那么我将在1000个AcitivityOccurrence
记录中索引所有活动信息。
如果我们这样索引的话,随着应用程序的增长会占用很大的空间
因此,我主要关心的是我必须做的索引的数量。
所以我想避免活动指标在ActivityOccurrence
。
那么是否有一种方法可以首先基于其过滤器搜索活动,然后根据活动的结果在范围内搜索ActivityOccurrence
?
注意:我们也有永不结束的出现。
任何想法?
除非您正在处理数百万个活动/事件,否则这可能是一个过早的优化-空间便宜,SOLR很快。从另一个角度来看,您是否考虑过仅索引与每个活动相关的活动发生列表(使用回调以确保它得到更新)?如果没有更多关于数据访问模式的信息,很难真正进行优化,但我从来不喜欢做不必要的往返。
也就是说,虽然我不确定如何编写一个纯SOLR查询来做到这一点,但您可以很容易地使用Sunspot:
确保ActivityOccurence
可以通过Activity
轻松搜索(即通过活动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参数:
with(:activity_id, activity_ids)
这将限制搜索这些活动的出现。注意,您是在牺牲搜索时间性能来换取索引效率。