c# asp.net asp.net-mvc lucene lucene.net

c# - Estructuración adecuada del uso de Lucene.Net en un sitio MVC de ASP.NET



asp.net-mvc (2)

Estoy construyendo un sitio MVC de ASP.NET donde planeo usar Lucene.Net. Imaginé una forma de estructurar el uso de Lucene, pero no estoy seguro de si mi arquitectura planificada es correcta y eficiente.

Mi plan:

  • En el evento Application_Start en Global.asax: compruebo la existencia del índice en el sistema de archivos; si no existe, lo creo y lo lleno con los documentos extraídos de la base de datos.
  • Cuando se envía nuevo contenido: creo un IndexWriter , lleno un documento, escribo en el índice y finalmente IndexWriter el IndexWriter . IndexWriters no se reutilizan, ya que no puedo imaginar una buena manera de hacerlo en una aplicación MVC de ASP.NET.
  • Cuando se edita el contenido: repito el mismo proceso que cuando se envía el nuevo contenido, excepto que primero elimino el contenido anterior y luego agrego las ediciones.
  • Cuando un usuario busca contenido: HttpRuntime.Cache para ver si un usuario ya buscó este término en los últimos 5 minutos; si lo hizo, devolví esos resultados; de lo contrario, creo un IndexReader , IndexReader y ejecuto una consulta, pongo los resultados en HttpRuntime.Cache , los devuelvo al usuario y finalmente IndexReader el IndexReader . Una vez más, los IndexReaders no son reutilizados.

Mis preguntas:

  • ¿Es esa una buena estructura? ¿Cómo puedo mejorarla?
  • ¿Hay algún problema de rendimiento / eficiencia que deba tener en cuenta?
  • Además, ¿ no es la reutilización de IndexReaders y IndexWriters un gran olor a código?

La respuesta a las tres preguntas es la misma: reutilizar a sus lectores (y posiblemente a sus escritores). Puede usar un patrón de singleton para hacer esto (es decir, declarar su lector / escritor como estático público). Las FAQ de Lucene te dicen lo mismo: comparte tus lectores, porque la primera consulta es realmente lenta. Lucene maneja todos los bloqueos por ti, así que realmente no hay razón para que no debas tener un lector compartido.

Probablemente sea más fácil mantener a su escritor cerca y (usando el modelo NRT ) obtener los lectores de eso. Si es raro que esté escribiendo en el índice, o si no tiene una gran necesidad de velocidad, entonces es probable que esté bien abrir su escritor cada vez. Eso es lo que hago.

Editar: añadido un ejemplo de código:

public static IndexWriter writer = new IndexWriter(myDir); public JsonResult SearchForStuff(string query) { IndexReader reader = writer.GetReader(); IndexSearcher search = new IndexSearcher(reader); // do the search }


Probablemente me saltaría el caché, Lucene es muy, muy eficiente. Quizás tan eficiente que es más rápido buscar de nuevo que el caché.

El índice completo OnApplication_Start se siente un poco extraño para mí, probablemente debería ejecutarse en su propio hilo para no bloquear otras actividades de inicio costosas.