2009-11-26 12 views
6

En mi proyecto utilizamos Lucene 2.4.1 para la búsqueda de texto completo. Este es un proyecto J2EE, IndexSearcher se crea una vez. En segundo plano, el índice se actualiza cada dos minutos (cuando el contenido cambia). Los usuarios pueden buscar el índice a través de un mecanismo de búsqueda en la página.Lucene parece estar almacenando resultados de búsqueda en caché, ¿por qué?

El problema es que los resultados devueltos por Lucene parecen almacenarse en caché de alguna manera.

Este es el escenario me di cuenta:

  • que inicie la aplicación y la búsqueda de la 'palabra clave' - se devuelven 6 resultados,
  • índice se actualiza, utilizando Luke veo, que hay 8 resultados ahora para consultar 'palabra clave',
  • Busco nuevamente usando la aplicación, de nuevo se devuelven 6 resultados.

Analicé nuestra configuración y no encontramos ningún almacenamiento en caché en ningún lugar. He depurado la búsqueda, y no hay un código de almacenamiento en caché, searcher.search returns 6 resultados.

¿El caché de Lucene resulta de alguna manera interno? ¿Qué propiedades, etc. debería verificar?

Respuesta

10

Para ver los cambios realizados por IndexWriters en un índice para el que tiene un IndexReader abierto, asegúrese de llamar al IndexReader.reopen() para ver los últimos cambios.

Asegúrese también de que su IndexWriter está cometiendo los cambios, ya sea a través de un commit explícito(), un close(), o teniendo autoCommit configurado en verdadero.

+1

Lo resolví recreando IndexSearcher cada vez que se actualiza el índice. Esto resolvió el problema. Creo que bajo las sábanas hace más o menos lo que dijiste. –

+4

reopen() es más eficiente, ya que al recrearlo hace que se lean todos los archivos de segmento, pero volver a abrir() sabe solo leer los segmentos que se han actualizado desde la última apertura. – Cowan

1

Con versiones anteriores a 2.9.0, Lucene guardó en caché automáticamente los resultados de las consultas. Con versiones posteriores no hay almacenamiento en caché a menos que ajuste su consulta en un QueryFilter y luego ajuste el resultado en un CachingWrapperFilter. Podría considerar cambiar a una versión> = 2.9.0 si la reapertura del índice se convierte en un problema

1

Una nota más: Para que IndexReader encuentre los otros hilos de los documentos actualizados en tiempo real, al inicializar IndexReader, el parámetro "read- solo "tiene que ser falso". De lo contrario, el método Reopen() no funcionará.

Cuestiones relacionadas