Ejecutamos re-índices completos cada 7 días (es decir, la creación del índice desde cero) en nuestro índice Lucene y los índices incrementales cada 2 horas más o menos. Nuestro índice tiene alrededor de 700,000 documentos y un índice completo demora alrededor de 17 horas (lo cual no es un problema).¿Debería optimizarse un índice después de los índices incrementales en Lucene?
Cuando hacemos índices incrementales, solo indexamos contenido que ha cambiado en las últimas dos horas, por lo que toma mucho menos tiempo, alrededor de media hora. Sin embargo, hemos notado que una gran cantidad de este tiempo (quizás 10 minutos) se usa para ejecutar el método IndexWriter.optimize().
El LuceneFAQ menciona que:
La clase IndexWriter apoya un método optimize() que compacta la base de datos de índice y acelera consultas. Es posible que desee utilizar este método después de realizar una indexación completa de su conjunto de documentos o después de las actualizaciones incrementales del índice. Si su actualización incremental agrega documentos con frecuencia, desea realizar la optimización solo de vez en cuando para evitar la sobrecarga adicional de la optimización.
... pero esto no parece dar ninguna definición de lo que significa "con frecuencia". La optimización es intensiva en CPU y MUY IO-intensiva, por lo que preferiríamos no hacerlo si podemos salirse con la suya. ¿Cuánto cuesta la ejecución de consultas en un índice no optimizado (estoy pensando especialmente en términos de rendimiento de la consulta después de un nuevo índice completo en comparación con después de 20 índices incrementales donde, digamos, 50,000 documentos han cambiado)? ¿Deberíamos estar optimizando después de cada índice incremental o el rendimiento alcanzado no lo vale?
Este tipo de cambios * son * disparos en la oscuridad sin ellos. –
Saludos, supongo que me preguntaba si la gente tenía experiencia en esto antes de sumergirme y comencé a jugar con un sistema de producción :) –
Mat: sí, me doy cuenta de que estabas buscando un consejo específico, y estaba siendo un poco general. En mi experiencia (he estado usando Lucene durante años) estarás bien sin la optimización(). He eliminado correctamente el optimize() de nuestros sistemas debido a su sobrecarga. –