2011-01-07 9 views
12

Soy nuevo en Lucene.NET pero estoy usando an open source tool construido para Sitecore CMS que usa Lucene.NET para indexar un montón de contenido del CMS. Ayer confirmé que cuando reconstruyo mis índices, los archivos de índice actuales se limpian para que todo lo que dependa del índice no obtenga datos durante aproximadamente 30-60 segundos (la cantidad de tiempo para una reconstrucción completa del índice). ¿Existe una mejor práctica o forma de que Lucene.NET no sobrescriba los archivos de índice actuales hasta que el nuevo índice se haya reconstruido por completo? Básicamente estoy pensando que me gustaría escribir en nuevos archivos de índice temp y cuando termine la reconstrucción, esos archivos sobrescriben el índice actual.Evite la eliminación del índice Lucene.NET actual durante la reconstrucción

ejemplo de lo que estoy hablando:

  • Construir índice actualizado (~ 30 segundos)
  • Índice cuenta con unos 500 documentos
  • utilizar código para acceder a los datos de índice y la vista en el sitio web
  • volver a generar índice (~ 30 segundos)
    • Cualquier código que ahora se lee el índice para los datos no devuelve nada, porque los archivos de índice están siendo overwritte norte; los resultados en el sitio web no se muestra ningún dato
  • Reconstruir completa: los datos ya está disponible de nuevo, datos de nuevo en el sitio web

Gracias de antemano

+1

Puede abrir un índice en modo de adición, en cuyo caso su índice actual permanece disponible hasta que vacíe o confirme sus nuevas escrituras. – Mikos

Respuesta

6

que no tienen experiencia con "Sitecore" sí, pero aquí es mi historia.

Recientemente hemos incorporado la búsqueda basada en índices (utilizando Lucene.Net) para nuestro subsistema de comercio electrónico. El proceso de actualización del índice para nuestro caso podría tomar aproximadamente media hora (~ 50,000 productos en sí mismos + mucha información relacionada). Para evitar una respuesta de "denegación de servicio" durante la actualización del índice, primero creamos una versión de "copia de seguridad" del mismo (simplemente copiando el directorio de índice a otra ubicación) y todas las demás solicitudes se redirigen para utilizar esta versión de "copia de seguridad". Cuando se completa la actualización del índice, eliminamos la copia de seguridad para que los clientes comiencen a usar la versión actualizada (o "en vivo") del índice. Esto también es útil en caso de excepciones no controladas que puedan ocurrir durante el proceso de actualización, ya que podría terminar en una situación en la que no tenga ningún índice (y en nuestro caso los clientes siempre pueden usar la versión de "copia de seguridad").

El API reference (Lucene 2.4) de los estados Lucene.Net.Index.IndexWriter objeto lo siguiente:

Tenga en cuenta que se puede abrir con un índice create=true incluso mientras que los lectores son utilizando el índice. Los lectores antiguos continuarán buscando en la instantánea "punto en el tiempo" que abrieron, y no verán el índice recién creado hasta que vuelvan a abrir.

Así que al menos no debe preocuparse por los clientes que actualmente están buscando dentro de su índice.

Espero que esto lo ayude a tomar una decisión correcta.

1

No estoy familiarizado con esa herramienta de sitecore, pero puedo responder cómo lo harías con Lucene puro.Net: debe usar una configuración NRT, lo que significa "tener un editor de índices y nunca cerrarlo".

Básicamente, los escritores de índice tienen un índice "virtual" en la memoria hasta que se vacía en el disco. Por lo tanto, siempre y cuando obtenga sus lectores del escritor, siempre verá las últimas novedades, incluso si todavía no se han descargado en el disco.

Cuestiones relacionadas