2012-06-29 76 views
9

我們在我們的Ruby on Rails應用程序中使用Sunspot Solr進行索引和搜索。如何在Sunspot Solr中僅重新索引一些對象

我們想重新索引一些對象,有人不小心從Rails控制檯運行Product.reindex命令。結果是,所有產品的索引都是從頭開始的,我們的目錄在索引編制發生時已空了。

由於我們有大量的數據,到目前爲止已經進行了三天的重新索引。今天早上,當我檢查重新馴化的進度時,似乎有一個數據輸入錯誤導致重新馴化未完成。

我不能重新啓動整個Product.reindex操作,因爲它需要太長時間。有沒有辦法只對所選產品運行reindexing?我想選擇一系列沒有編入索引的產品,然後在這個文件上運行索引。如何將單個產品添加到索引而無需運行整個數據集的完整重新索引?

+0

當你說 - 如何在沒有..的情況下將單個產品添加到索引中?「,是指單個列/字段還是文檔的子集? – user1452132

回答

7

我發現在https://github.com/sunspot/sunspot#reindexing-objects

答案當一個對象被保存,它會自動重新索引爲節省回調的一部分。因此,所有需要的是將需要重新索引的所有對象添加到數組中,然後遍歷數組,並調用每個對象的保存。這成功地更新了索引中所需的對象。

+0

您是如何知道哪些尚未索引的? – kidbrax

+0

我們做了一些手工抽查。我們知道在2011年開始製作產品之後,reindex崩潰了,因此我們從2012年手動檢查了部分產品。然後我們在Rails控制檯中進行了查詢,以構建包含這些產品的數組並再次保存它們,從而觸發回調。 – Stanley

+1

如果重新索引需要這麼長時間,那麼您可能會天真地做到這一點,而不考慮您在搜索定義中使用的任何關聯。這就是內置rake任務的工作原理,並且非常慢。儘管reindex命令可以採用ActiveRecord,但效率更高。我從15分鐘到15秒完成了一個完整的索引。嘗試使用這種語法:'''Book.solr_reindex(:batch_size => 1000,:include => [:author,{:chapters =>:段落}])'' 同樣看看你是否不必要地允許部分詞搜索,這實際上是大宗指數。 –

12

太陽黑子沒有索引保存回調中的對象,所以你可以保存每個對象,但也許會觸發其他回調。更精確的方法來做到這將是

Sunspot.index [post1, post2] 
Sunspot.commit 

或自動提交

Sunspot.index! [post1, post2] 

你甚至可以通過在對象的關係,因爲他們只是一個數組太

Sunspot.index! post1.comments 
相關問題