2010-09-30 11 views
8

Estoy tratando de hacer un prototipo de una aplicación de indexación/búsqueda que utiliza fuentes muy volátiles de datos de indexación (foros, redes sociales, etc.), estos son algunos de los requisitos de rendimiento,Cómo manejar las actualizaciones muy frecuentes a un índice de Lucene

  1. vuelco muy rápido el tiempo (con esto quiero decir que los nuevos datos (como un nuevo mensaje en un foro) deben estar disponibles en los resultados de búsqueda muy poco (menos de un minuto))

  2. I es necesario descartar documentos viejos de manera bastante regular para garantizar que los resultados de búsqueda no tengan fecha.

  3. Por último, pero no menos importante, la aplicación de búsqueda debe ser receptiva. (Latencia del orden de 100 milisegundos, y debe soportar al menos 10 QPS)

Todos los requisitos que he actualmente se pueden cumplir w/o usando Lucene (y que me permitiera satisfacer todas 1,2 y 3), pero anticipo otros requisitos en el futuro (como relevancia de búsqueda, etc.) que Lucene hace más fáciles de implementar. Sin embargo, dado que Lucene está diseñado para casos de uso mucho más complejos que el que estoy trabajando en este momento, me está costando cumplir mis requisitos de rendimiento.

Aquí hay algunas preguntas,

a. Leí que el método optimize() en la clase IndexWriter es caro, y no debe ser utilizado por aplicaciones que realizan actualizaciones frecuentes, ¿cuáles son las alternativas?

b. Para hacer actualizaciones incrementales, debo seguir cometiendo nuevos datos y también actualizar el lector de índices para asegurarme de que tenga los nuevos datos disponibles. Estos van a afectar 1 y 3 arriba. ¿Debería probar índices duplicados? ¿Cuáles son algunos enfoques comunes para resolver este problema?

c. Sé que Lucene proporciona un método de eliminación, que le permite eliminar todos los documentos que coinciden con una determinada consulta, en mi caso, tengo que eliminar todos los documentos que son anteriores a cierta edad, ahora una opción es agregar un campo de fecha a cada documentar y usar eso para borrar documentos más tarde. ¿Es posible hacer consultas de rango en documentos ID (puedo crear mi propio campo de identificación ya que creo que el creado por lucene sigue cambiando) para eliminar documentos? ¿Es más rápido que comparar fechas representadas como cadenas?

Sé que estas son preguntas muy abiertas, por lo que no estoy buscando una respuesta detallada, intentaré tratar todas sus respuestas como sugerencias y usarlas para informar mi diseño. ¡Gracias! Por favor, avíseme si necesita cualquier otra información.

Respuesta

0

R: Creo que con las últimas versiones de Lucene, el método de optimización no es realmente necesario y, con mi sugerencia para el elemento C, realmente no debería ser necesario.

B: Una vez más, creo que con la última versión de Lucene, los Buscadores son conscientes de cuándo se realizan las actualizaciones y pueden manejar eso sin que tenga que hacer nada especial.

C: Evitaría borrar y crear un nuevo índice diariamente. Si almacena la antigüedad del documento en el índice, puede usar el índice existente para crear el nuevo. Durante la redacción de su índice, busque todos los documentos jóvenes, recorra los mismos y agréguelos a su nuevo índice. Tenga un método de utilidad pública llamado getCurrentIndex que utilizan los buscadores para obtener el último índice en vivo. Mantenga 1 o 2 índices viejos por si acaso y debería estar listo para continuar.

3

Es posible que desee considerar el uso de Solr en lugar de Lucene vertical. Solr maneja todos los requisitos que mencionó (actualizaciones casi en tiempo real, eliminación de documentos, rendimiento/fragmentación, consultas de rango), y lo hará mejor que su propio código enrollado a mano. No tendrá que lidiar con problemas en el nivel de IndexReader, es decir, cuándo actualizar el IndexReader después de una actualización.

En cuanto a las consultas de rango, Solr tiene capacidades de TrieField, lo que hace que las consultas de rango numérico sean muy rápidas. Ver http://www.lucidimagination.com/blog/2009/05/13/exploring-lucene-and-solrs-trierange-capabilities/

5

Lucene ahora es compatible con Near Real Time Search. Básicamente, obtienes un lector de IndexWriter cada vez que haces una búsqueda. Los cambios en la memoria no van al disco hasta que se alcanza el tamaño del búfer de RAM o se invoca un commit explícito en el escritor. Como el disco IO se evita omitiendo commit, las búsquedas vuelven rápidamente incluso con los datos nuevos.

Uno de los problemas con el NRT de Lucene es el algoritmo de fusión Logaritmo de índice. Se genera una fusión después de que se agregan 10 documentos a un segmento. A continuación, estos 10 segmentos se fusionan para crear un segmento con 100 documentos y así sucesivamente. Ahora, si tiene 999.999 documentos y se inicia una fusión, le llevará bastante tiempo regresar, rompiendo su promesa de "tiempo real".

LinkedIn ha lanzado Zoie, una biblioteca en la parte superior de Lucene que resuelve este problema. Esto es en vivo en producción manejando millones de actualizaciones y búsquedas todos los días.

En su mayoría, Lucene admitirá todos sus requisitos, ya que está descartando actualizaciones antiguas y la ventana móvil es aproximadamente de tamaño constante. En caso de que no sea así, es posible que tengas que probar Zoie, que se demuestra en el campo de batalla.

0

Puede almacenar en caché su buscador de índice durante un breve período de tiempo y volver a abrirlo. Usamos para este propósito asp.net WebCache que tiene CacheItemUpdateCallback que se llama justo antes de que caduque el elemento.

Cuestiones relacionadas