在solr中嵌套搜索

时间:2014-03-27 08:49:47

标签: ruby-on-rails-3 sunspot sunspot-rails

我有一个活动模型和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

注意:我们也永远不会结束事件。

有什么想法吗?

提前致谢。

1 个答案:

答案 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)

这会将搜索限制为这些活动的发生次数。请注意,您正在利用搜索时间性能来衡量索引效率。