2012-06-29 7 views
9

Utilizamos Sunspot Solr para indexar y buscar en nuestra aplicación Ruby on Rails.Cómo reindexar solo algunos objetos en Sunspot Solr

Queríamos reindexar algunos objetos y alguien ejecutó accidentalmente el comando Product.reindex desde Rails Console. El resultado fue que la indexación de todos los productos comenzó desde cero y nuestro catálogo apareció vacío mientras se llevaba a cabo la indexación.

Dado que tenemos una gran cantidad de datos, la reindexación se ha realizado en tres días hasta el momento. Esta mañana, cuando verifiqué el progreso de la reindexación, parece que hubo una entrada de datos corruptos que dio como resultado la reindexación deteniéndose sin completar.

No puedo volver a reiniciar toda la operación Product.reindex ya que lleva demasiado tiempo. ¿Hay alguna manera de ejecutar únicamente la reindexación en productos seleccionados? Quiero seleccionar una gama de productos que no están indexados y luego solo ejecutar indexación en este. ¿Cómo puedo agregar un único producto al índice sin tener que ejecutar un reindex completo de todo el conjunto de datos?

+0

Cuando dicen - ¿Cómo puedo agregar un único producto al índice sin ... ", ¿quiere decir una sola columna/campo o un subconjunto de documentos? – user1452132

Respuesta

7

he encontrado la respuesta en https://github.com/sunspot/sunspot#reindexing-objects

Cada vez que se guarda un objeto, se re-indexada automáticamente como parte de las devoluciones de llamada de ahorrar. Entonces, todo lo que se necesitaba era agregar todos los objetos que necesitaban reindexarse ​​a una matriz y luego recorrer la matriz, llamando a guardar cada objeto. Esto actualizó con éxito los objetos requeridos en el índice.

+0

¿Cómo sabía cuáles no se habían indexado aún? – kidbrax

+0

Hicimos algunas comprobaciones manuales. Sabíamos que el reindex se colapsó en algún momento después de fabricar productos a partir de 2011, por lo que verificamos manualmente algunos de nuestros productos a partir de 2012. Luego realizamos consultas en la consola de Rails para construir una matriz que contenía estos productos y los guardamos de nuevo, lo que provocó las devoluciones de llamada. – Stanley

+1

Si reindexar lleva tanto tiempo, es posible que lo haga ingenuamente, sin tomar en consideración las asociaciones que está utilizando en las definiciones de búsqueda. Así es como funciona la tarea de rake incorporada, y es muy lenta. Sin embargo, el comando reindex puede tomar inclusiones ActiveRecord, permitiendo una mayor eficiencia. Tomé un índice completo de 15 minutos a 15 segundos. Pruebe esta sintaxis: '' 'Book.solr_reindex (: batch_size => 1000,: include => [: author, {: chapters =>: paragraph}]' '' Vea también si está permitiendo innecesariamente la palabra parcial búsquedas, que realmente aumentan el índice. –

12

Sunspot indexa un objeto en la devolución de llamada guardada para que pueda guardar cada objeto, pero quizás eso también active otras devoluciones de llamada. Una forma más precisa de hacerlo sería

Sunspot.index [post1, post2] 
Sunspot.commit 

o con el compromiso automático

Sunspot.index! [post1, post2] 

incluso se podría pasar en las relaciones de objeto, ya que son simplemente un conjunto demasiado

Sunspot.index! post1.comments 
Cuestiones relacionadas