2012-01-16 17 views
17

estoy usando lucene para indexar documentos y realizar una búsqueda, después de lo cual, los borro inmediatamente. todo esto puede ser considerado como una acción un tanto atómico que incluye los siguientes pasos:lucene buenas prácticas y seguridad de hilos

índice (escritor) -> de búsqueda (buscador) -> obtener documentos por puntuación (lector) -> docs de borrado (lector)

esta acción puede llevarse a cabo por múltiples procesos simultáneos en el mismo índice (utilizando FSDirectory).

NOTA IMPORTANTE: cada hilo maneja un conjunto separado de documentos para un hilo no tocará los documentos de otro hilo

para tal fin tengo un par de preguntas:

1) ¿Debo usar un único instancias (para todos los hilos) de IndexWriter, IndexReader y IndexSearcher? (se supone que son seguros para hilos)

2) ¿puede un IndexWriter manipular un índice mientras y IndexReader borra documentos? ¿Necesito cerrar uno para que el otro haga lo suyo? es decir, ¿puede un hilo escribir en un índice mientras otro lo elimina (como mencioné anteriormente, puedo garantizar que manejan conjuntos separados de datos)

3) cualquier otra buena práctica y sugerencia que pueda tener será más apreciado.

muchas gracias!

Respuesta

29

IndexWriter, IndexReader y IndexSearcherson thread-safe según la javadoc api:

NOTA: IndexSearcher casos están completamente hilo de seguridad, lo que significa múltiples hilos puede llamar a cualquiera de sus métodos, concurrentemente

NOTA: IndexReader instancias son completamente seguras para subprocesos, lo que significamúltiples Los subprocesospueden llamar a cualquiera de sus métodos, al mismo tiempo.

NOTA: IndexWriter casos son completamente seguro para subprocesos, lo que significa múltiples hilos pueden llamar a cualquiera de sus métodos, al mismo tiempo

múltiple IndexReader s se pueden abrir, pero es mejor que compartir un solo lectura (por razones de rendimiento).

Se puede abrir solo un IndexWriter (y se creará un bloqueo de escritura para evitar que otros se abran en el mismo índice). Puede usar IndexReader para borrar documentos, mientras que IndexWriter mantiene este bloqueo.IndexReader siempre verá el índice tal como estaba en el momento en que se abrió, los cambios realizados por el escritor serán visibles solo después de que el escritor los confirme, el lector volverá a abrirse.

Se puede abrir cualquier número de IndexSearcher s, pero una vez más es mejor compartir uno. Se pueden usar incluso mientras se modifica el índice. Funciona igual que para IndexReader (los cambios no son visibles hasta que se reabre el buscador).

+0

gracias por la rápida y bien escrita respuesta! – levtatarov

Cuestiones relacionadas