如何重新索引Sunspot Solr中的某些对象

Sta*_*ley 10 solr ruby-on-rails sunspot

我们使用Sunspot Solr在我们的Ruby on Rails应用程序中进行索引和搜索.

我们想重新索引一些对象,有人不小心从Rails控制台运行了Product.reindex命令.结果是所有产品的索引从头开始,我们的目录在索引进行时显得空白.

由于我们有大量的数据,因此到目前为止已经进行了三天的重新索引.今天早上,当我检查重建索引的进度时,似乎有一个损坏的数据输入导致重建索引停止而没有完成.

我不能再次重新启动整个Product.reindex操作,因为它需要太长时间.有没有办法只对所选产品进行重建索引?我想选择一系列未编制索引的产品,然后在这个上运行索引.如何在不必运行整个数据集的完整重建索引的情况下将单个产品添加到索引中?

s01*_*ist 14

Sunspot会对保存回调中的对象进行索引,因此您可以保存每个对象,但也可能会触发其他回调.更精确的方法是

Sunspot.index [post1, post2]
Sunspot.commit
Run Code Online (Sandbox Code Playgroud)

或者自动提交

Sunspot.index! [post1, post2]
Run Code Online (Sandbox Code Playgroud)

您甚至可以传递对象关系,因为它们也只是一个数组

Sunspot.index! post1.comments
Run Code Online (Sandbox Code Playgroud)


Sta*_*ley 7

我在https://github.com/sunspot/sunspot#reindexing-objects上找到了答案

无论何时保存对象,它都会自动重新编制索引,作为保存回调的一部分.因此,所需要的只是将需要重新索引的所有对象添加到数组中,然后遍历数组,在每个对象上调用save.这成功更新了索引中的所需对象.

  • 如果重新索引花费的时间太长,则可能是您天真地这样做了,而没有考虑您在搜索定义中使用的任何关联。这就是内置的rake任务的工作方式,而且非常慢。reindex命令可以使用ActiveRecord包含的内容,以实现更高的效率。我将完整的索引从15分钟降低到15秒。尝试使用以下语法:```Book.solr_reindex(:batch_size => 1000,:include => [:author,{:chapters =>:paragraphs}])``````还可以查看是否不必要地允许部分单词搜索,这确实增加了索引。 (2认同)