Huir de Madrid en Agosto. Es el sabio consejo de a quién – por lo general la mayoría – no le agrada la idea de vivir a más de 40 grados de temperatura. Algún Inglés o Alemán seguro siempre hace la excepción.
Una de las alternativas y quizá mi favorita es huir a la Coruña, una ciudad no solo fresca con temperaturas menores a 30 grados durante el verano, sino además con una hermosura épica de quien sabe apreciar lo majestuoso que es vivir junto al mar, disfrutar de una buena ¨mariscada¨ y vivir el amable trato de su gente.
Algo no muy distinto sucede con Sphinx(véase más sobre Sphinx), el excelente motor de búsqueda que compite con SolR, Lucene y compañía; existen momentos en los que tenemos que indexar al motor de búsqueda nuevos datos para mantener al dia los índices. Entonces: ¿Cómo llevar de vacaciones a Sphinx de Madrid a la Coruña y mantenerlo fresco?, realmente es sencillo.
El principal problema con Sphinx y a diferencia con otros motores de búsqueda es la atomicidad del indexado, es decir no se puede actualizar solo un documento de forma aislada, sino que se requiere re-indexar por completo[1]. Esto, en bases de datos grandes de por ejemplo mas de tres millones de registros, nos genera inconveniente de recursos, tiempo y dinero. Imagina que por solo agregar un registro que requiere ser indexado, se debe ejecutar el proceso de re-indexado completo: el tiempo que lleva es exagerado.
Para este ejercicio utilizaremos el marco de trabajo de Ruby On Rails y la gema ThinkingSphinx, la cual es una excelente herramienta de reducción de la complejidad para trabajar con este motor de búsqueda.
Existen varias estrategias, basadas en DelayedJobs, para encolar los procesos de indexado de registros nuevos y ejecutarlos en un momento configurable determinado[2], sin embargo, si no queremos hacer uso de los workers por defecto y queremos implementar estrategias propias, la solución pasa por restringir la ejecución de los jobs que por defecto trae ThinkingSphinx e implementar la nuestra. Para este caso, utilizaremos un cron job que cada x tiempo re-indexe nuestros documentos. Por ejemplo:
Lo primero es sobrescribir la clase de ThinkingSphinx para evitar que se realize el indexado por defecto.
[gist id=3357666 file=Inhibit_delta_works.rb]
En segundo lugar, se le dice al modelo en el bloque de indexado que siga nuestra estregia delta.
[gist id=3369074 file=model.rb]
Por último, a través de la gema Whenever, se configura el cron job que se desea y se ejecuta el comando de sphinx para re-indexar los delta.
[gist id=3369086 file=schedule.rb]
¿Cuándo utilizar ésta estrategia? cuando por ejemplo no queremos hacer uso de base de datos relacionales, ni utilizar Redis y queremos tener el control de cuando indexar o no. De esta forma mantenemos los índices de Sphinx frescos como A Coruña, de una forma sencilla y quizá elegante.
Finalizo, recordando que debo ir a buscar la empanada de mejillones que he encargado, comprar unas cervezas bien frías e ir a comer junto al mar: ¿Hay algo mejor en el mundo?
REFERENCIAS
[1] http://freelancing-god.github.com/ts/en/deltas.html
[2] http://opensoul.org/blog/archives/2009/04/29/keepin-sphinx-indexes-fresh-2/
Man, leí el artículo engañado, pensando que se trababa de Sphinx, el motor de documentación de Python[1], jajajajajajajaja. Interesante, he usado Solr para un par de cosas en la oficina, nada muy avanzado. Jajajajajajaja quisiera aportar más con el comentario, pero como te dije, leí pensnado que se trataba del generador de documentación para Python, en cuyo caso podría facilitarte algunos recursos chéveres. En todo caso, échale un ojo.
[1] http://sphinx.pocoo.org/