2008-10-11 7 views
15

Al usar Lucene.Net con ASP.NET, me imagino que una solicitud web puede desencadenar una actualización del índice mientras que otra solicitud web realiza una búsqueda. ¿Lucene.Net ha incorporado la posibilidad de gestionar el acceso simultáneo, o tengo que administrarlo, para evitar errores de "ser utilizado por otro proceso"?¿Lucene.Net administra varios hilos que acceden al mismo índice, un índice mientras que el otro está buscando?

EDITAR: Después de leer los documentos y la experimentación, esto es lo que creo que he aprendido: hay dos problemas, la seguridad del hilo y la concurrencia. El subprocesamiento múltiple es "seguro" en el sentido de que no se puede hacer nada malo con el índice. Pero, es seguro a costa de un solo objeto que tiene un bloqueo en el índice a la vez. El segundo objeto vendrá y lanzará una excepción. Por lo tanto, no puede dejar una búsqueda abierta y esperar que un escritor en otro hilo pueda actualizar el índice. Y si un hilo está ocupado actualizando el índice, entonces tratar de crear un buscador fallará.

Además, los buscadores ven el índice tal como estaba en el momento en que lo abren, por lo que si los mantienen actualizados y actualizan el índice, no verán las actualizaciones.

Quería que mis búsquedas vieran las últimas actualizaciones.

Mi diseño, y parece que está funcionando hasta el momento, es que mis escritores y buscadores comparten un candado, para que no fallen, solo esperan, hasta que se complete la escritura o búsqueda actual.

+0

¿Podría explicar cómo implementó las cerraduras? ¿Utiliza bloqueos de lectura y escritura o solo un bloqueo compartido? –

+0

Un bloqueo compartido. Escribí lo que hice: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx –

+0

Lo que dices en tu pregunta es incorrecto: "Entonces, puedes "Deje una búsqueda abierta y espere que un escritor en otro hilo pueda actualizar el índice. Y si un hilo está ocupado actualizando el índice, entonces tratar de crear un buscador fallará". Como se menciona en las otras respuestas: "Un escritor o lector de índice puede editar los archivos de índice lucene mientras las búsquedas están en curso" y viceversa. –

Respuesta

2

No tiene un problema con eso tanto como administrar escrituras concurrentes en el índice. He tenido un camino más fácil con SOLR, que abstrae la mayoría de esas diferencias, ya que se ejecuta como servidor.

21

Según this page,

indexación y búsqueda no sólo son hilo de seguridad, pero seguro proceso. Lo que esto significa es que:

  • buscadores índice múltiples se pueden leer los archivos de índice Lucene al mismo tiempo.
  • Un escritor índice o lector puede editar los archivos de índice Lucene, mientras que las búsquedas son curso
  • escritores índices múltiples o lectores pueden tratar de editar los archivos de índice Lucene al mismo tiempo (es importante para el escritor índice/reader que se cerrará para que libere el bloqueo de archivos ). Sin embargo, el analizador de consultas no es seguro para subprocesos, por lo que cada subproceso que utiliza el índice debe tener su propio analizador de consultas .

El escritor índice sin embargo, es el hilo seguro, por lo que puede actualizar el índice mientras que las personas que están buscando. Sin embargo, debe asegurarse de que los hilos con índice abierto los busquen y abran los nuevos , para obtener los datos recién actualizados.

+0

¿Cuál es la sobrecarga del índice de apertura en cada consulta? –

+1

Tenemos un índice de búsqueda bastante grande (varios gigabytes) y el costo de abrir un índice en cada consulta ha sido insignificante. –

+1

Cabe señalar que este artículo es sobre el Lucene original para Java. No se menciona la implementación de .NET, ni si el comportamiento descrito es una característica del "estándar" de Lucene (y por lo tanto se volvería a implementar en Lucene.Net) o si se trata de un comportamiento específico de la implementación. –

3

Es posible que tenga problemas, si su hilo de indexación es la creación de un nuevo documento que da lugar a la fusión de algunos segmentos del índice, a continuación, se eliminarán los segmentos fusionados y se crearán nuevo segmento.El problema es que el buscador de índice cargó todos los segmentos cuando se abrió, por lo que tiene "punteros" para los segmentos que existían cuando se abrió. Ahora, si el escritor del índice fusiona un segmento y elimina un segmento, su buscador de índice seguirá creyendo que ese archivo de segmento existe y fallará con un "error de archivo no encontrado". Lo que realmente necesita hacer es separar su índice de escritura de su índice de búsqueda, utilizando SOLR o haciendo su propia replicación de instantáneas de índice similar a lo que SOLR hace. Tengo un sistema muy similar a SOLR usando .NET y Lucene.NET en Windows, usando enlaces duros NTFS para hacer una replicación eficiente de instantáneas. Te puedo dar más información si estás interesado.

+0

Hola Bob, estoy usando SolrNet con asp.net mvc. Estoy empezando a experimentar problemas reales con el índice de corrupción al intentar agregar nuevos elementos mientras se realizan las búsquedas. Estaría agradecido si pudiera proporcionar alguna información sobre las mejores prácticas. – Jordan

Cuestiones relacionadas