在solr中嵌套搜索



我有一个活动模型和活动发生模型,其中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)

这将限制搜索这些活动的出现。注意,您是在牺牲搜索时间性能来换取索引效率。

相关内容

  • 没有找到相关文章

最新更新