¿Debería optimizarse un índice después de índices incrementales en Lucene?

StackOverflow https://stackoverflow.com/questions/119994

  •  02-07-2019
  •  | 
  •  

Pregunta

Realizamos reindexaciones completas cada 7 días (es decir,creando el índice desde cero) en nuestro índice Lucene e índices incrementales cada 2 horas aproximadamente.Nuestro índice tiene alrededor de 700.000 documentos y un índice completo tarda alrededor de 17 horas (lo cual no es un problema).

Cuando hacemos índices incrementales, solo indexamos el contenido que ha cambiado en las últimas dos horas, por lo que lleva mucho menos tiempo: alrededor de media hora.Sin embargo, hemos notado que gran parte de este tiempo (tal vez 10 minutos) se dedica a ejecutar el método IndexWriter.optimize().

El LucenePreguntas frecuentes menciona que:

La clase IndexWriter admite un método optimizar() que compacta la base de datos de índice y acelera las 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 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 "frecuentemente".La optimización requiere un uso intensivo de la CPU y MUY intensivo de IO, por lo que preferiríamos no hacerlo si podemos salirnos con la nuestra.¿Cuál es el impacto de ejecutar consultas en un índice no optimizado (pienso especialmente en términos de rendimiento de la consulta después de una reindexación completa en comparación con después de 20 índices incrementales donde, digamos, han cambiado 50.000 documentos)?¿Deberíamos optimizar después de cada índice incremental o no vale la pena el impacto en el rendimiento?

¿Fue útil?

Solución

Mat, ya que pareces tener una buena idea de cuánto tiempo lleva tu proceso actual, te sugiero que elimines el optimize() y medir el impacto.

¿Muchos de los documentos cambian en esos períodos de 2 horas?Si sólo se reindexa gradualmente una pequeña fracción (50.000/700.000 es aproximadamente el 7%), entonces no creo que se obtenga mucho valor de una optimize().

Algunas ideas:

  • No hagas un incremental optimize() en absoluto.Mi experiencia dice que de todos modos no estás viendo una gran mejora en las consultas.
  • Hacer el optimize() diariamente en lugar de cada 2 horas.
  • Hacer el optimize() durante épocas de bajo volumen (que es lo que javadoc dice).

Y asegúrese de tomar medidas.Este tipo de cambios pueden ser un tiro al blanco sin ellos.

Otros consejos

Un optimize La operación lee y escribe todo el índice, ¡por eso requiere tanto IO!

La idea detrás de las operaciones de optimización es volver a combinar todos los distintos segmentos del índice de Lucene en un solo segmento, lo que puede reducir en gran medida los tiempos de consulta, ya que no es necesario abrir y buscar varios archivos por consulta.Si está utilizando la estructura de archivo de índice normal de Lucene (en lugar de la estructura combinada), obtendrá un nuevo segmento por operación de confirmación;Lo mismo que tus reindexaciones, supongo.

Creo Mate tiene excelentes consejos y apoyaría todo lo que dice: déjese guiar por los datos que tiene.De hecho, iría un paso más allá y solo optimizaría a) cuando sea necesario yb) cuando tenga un volumen de consultas bajo.

Como el rendimiento de las consultas está íntimamente ligado al número de segmentos de su índice, una simple ls -1 index/segments_* | count podría ser un indicador útil de cuándo es realmente necesaria la optimización.

Alternativamente, sería una mejor solución realizar un seguimiento del rendimiento y el volumen de la consulta e iniciar una optimización cuando se alcance un rendimiento bajo inaceptable con un volumen aceptablemente bajo.

En este correo, consejos de Otis Gospodnetic contra usando optimizar, si su índice recibe actualizaciones constantes.Es del 2007, pero llamando optimize() es, por su propia naturaleza, una operación con mucha IO.Podría considerar utilizar un enfoque más gradual;a Programador de fusión

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top