我有一个活动模型和ActivityOccurrence模型Activity has_many :activity_occurrences
Activity
:此模型将包含ActivityOccurrence
AcitvityOccurrence
:attrs - occurrence(datetime),已完成。
现在我们有新的要求,当用户搜索特定范围内的活动时,我们必须在搜索结果中显示所有活动。
以前我们过去只会在重复活动时只显示一条记录。
因此,根据新要求,我们决定将搜索从Activity
移至ActivityOccurrence
。
现在,我不希望在每个ActivityOccurrence中对Activity
的元信息编制索引,因为我的活动有10个字段超过ActivityOccurrence
,
例如:
如果我Activity
有1000 AcitivityOccurrence
,那么我将在1000 AcitivityOccurrence
条记录中索引我的所有活动信息。
如果我们以这种方式索引,这会占用大量空间
因此,我主要担心的是我必须做的索引量。
所以我想在ActivityOccurrence
中避免使用活动索引。
那么有没有办法首先根据其过滤器搜索Activity,然后根据活动的结果搜索范围内的ActivityOccurrence
?
注意:我们也永远不会结束事件。
有什么想法吗?
提前致谢。
答案 0 :(得分:0)
除非你处理数以百万计的活动/事件,否则这可能是一个不成熟的优化 - 空间便宜,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)
这会将搜索限制为这些活动的发生次数。请注意,您正在利用搜索时间性能来衡量索引效率。