2009-02-02 13 views
5

Utilicé Lucene.net para implementar la funcionalidad de búsqueda (tanto para el contenido de la base de datos como para los documentos cargados) en varios sitios web pequeños sin ningún problema. Ahora tengo un sitio en el que indexo más de 5000 documentos (principalmente archivos PDF) y las consultas se vuelven un poco lentas.Almacenamiento en caché de los resultados de búsqueda de Lucene.net

Supongo que la mejor manera de acelerarlo sería implementar el almacenamiento en caché de algún tipo. ¿Alguien puede dar mis punteros/ejemplos sobre dónde comenzar? Si tiene alguna otra sugerencia además del almacenamiento en caché (por ejemplo, ¿debería usar múltiples índices?), Me gustaría escucharlas también.

Editar:

error del usuario tontos responsable de la lenta consulta. Estaba creando elementos destacados para todo el conjunto de resultados a la vez, en lugar de solo la 'página' que estaba mostrando. Oops.

Respuesta

5

Voy a hacer una gran suposición aquí y supongo que no está colgando en sus búsquedas de índice entre las llamadas para consultar el índice.

Si eso es cierto, entonces definitivamente debe compartir los buscadores de índice para todas las consultas a su índice. A medida que el índice se hace más grande (y realmente no tiene que ser muy grande para que esto se convierta en un factor), la reconstrucción del buscador de índices se convertirá cada vez más en una sobrecarga. Para que esto funcione correctamente, deberá sincronizar el acceso a la clase del analizador de consultas (no es seguro para subprocesos).

BTW, los documentos de Java son (he encontrado) igual que aplicable a la versión .net.

Para obtener más información sobre su problema, ver aquí: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

+0

Buen enlace, gracias – Nick

+0

Sin problemas. ¿Todo está funcionando bien en su sitio web ahora? –

1

Lucene utiliza su propio mecanismo de "caché" interno para hacer que la recuperación de índices sea una operación rápida. Sin embargo, no creo que el almacenamiento en caché sea su problema aquí.

Un documento de 5000 índices parece de un tamaño trivial, pero esto depende en gran medida de cómo está construyendo su índice, qué está indexando/almacenando, cómo está consultando (operacionalmente), tamaño del documento, etc.

Complete los espacios en blanco con tanta información como pueda sobre su índice.

1

En primer lugar, en sí Lucene es compatible con una versión en memoria de directorios:

Lucene.Net.Store.RAMDirectory 

Usted puede usarlo como:

RAMDirectory idx = new RAMDirectory(); 

// Make an writer to create the index 
IndexWriter writer = 
    new IndexWriter(idx, new StandardAnalyzer(), true); 

Si esto funciona para usted, pero está utilizando demasiada memoria RAM, escriba un contenedor y exhíbalo como una interfaz o servicio web. O bien, si simplemente desea almacenar en caché lo que está consultando para controlar cuando las entidades abandonan el caché, puede escribir un contenedor alrededor de Lucene que almacena en caché los resultados más comunes para usted en función de las palabras clave, obviamente.

Prefiero lo mencionado. Cree un servicio web o un proyecto de servicio que envuelva la tienda Lucene, utilizando RAMDirectory. De esta forma, puede descargar el servicio web en otro servidor con gran cantidad de RAM si el índice es enorme y tiene resultados casi instantáneos.

1

Asegúrese de optimizar sus índices.

Además, esta es una forma rápida/fácil/efectiva de implementar el almacenamiento en caché: HttpRuntime.Cache.Add (...);

Puede usar el caché ASP.Net desde cualquier tipo de proyecto/biblioteca.

Cuestiones relacionadas