ruby-on-rails solr sunspot

ruby on rails - Cómo reindexar solo algunos objetos en Sunspot Solr



ruby-on-rails (2)

Usamos Sunspot Solr para indexar y buscar en nuestra aplicación Ruby on Rails.

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.

Como tenemos una gran cantidad de datos, la reindexación se ha realizado en tres días. 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 reiniciar toda la operación de 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?


Encontré la respuesta en https://github.com/sunspot/sunspot#reindexing-objects

Cada vez que se guarda un objeto, se vuelve a indexar automáticamente como parte de las devoluciones de llamadas guardadas. 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.


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 confirmación automática

Sunspot.index! [post1, post2]

Incluso podrías pasar las relaciones de objeto ya que también son solo una matriz

Sunspot.index! post1.comments