7

He creado una aplicación ASP.NET MVC con MVC 2.0 y Fluidez NHibernate (escondida detrás de los repositorios por alguna razón). La aplicación representa un dominio bastante complejo con algunos objetos diferentes, como usuarios, mensajes, comentarios, archivos y citas.¿Cuál es la mejor manera de implementar una búsqueda de texto completo para una aplicación ASP.NET MVC?

Ahora quiero implementar una búsqueda de texto completo que permita al usuario encontrar fácilmente todo tipo de contenido simplemente ingresando una frase de búsqueda. Cuando manejo por separado todos los tipos de objetos diferentes en la aplicación, ahora tengo que ponerlos "juntos" para la búsqueda. Eso significa que el usuario no hace distinción entre los diferentes tipos, simplemente ingresa "xyz" y quiere obtener resultados en una lista, comentarios mezclados con mensajes, etc.

La opción 1 es crear un servicio de búsqueda que busque la búsqueda resultado de los diferentes repositorios y prepara la salida combinada (clasificación, paginación, etc.). Pero eso es realmente, muy caro cuando la información detrás crece (y crecerá).

Así que estoy buscando una solución alternativa. Actualmente estoy trabajando con SQL Server 2008. Lo que he encontrado es lucene.net (http://lucene.apache.org/lucene.net/), pero no invertí mucho tiempo todavía.

¿Alguna sugerencia?

Respuesta

2

Definitivamente voy con las capacidades de texto completo de SQL. Entiendo que parte del contenido podría estar disponible en archivos, otras estructuras, pero incluso así, la mayoría de los datos deberían estar en el backend y SQL hace un buen trabajo con los índices de texto completo en cuanto a arquitectura.

Sugiero que empiece con texto completo de SQL y cree un pequeño componente que consulte los otros recursos (si es necesario). Supongo que el 80% del contenido de búsqueda vendría de SQL Server.

Aquí hay un par de recursos para comenzar con texto completo de SQL Server:

  1. http://msdn.microsoft.com/en-us/library/ms142571.aspx
  2. http://www.dotnetfunda.com/articles/article1019-implementing-fulltext-search-on-view-.aspx?sms_ss=dotnetshoutout
+0

Es incluso el 100% de los datos provenientes de SQL Server. Así que tienes razón, simplemente tomo la buena costumbre, tal vez incluso con un procedimiento almacenado o simplemente ADO.NET - afortunadamente todavía estoy usando repositorios. –

2

Para .Net puede buscar en RavenDB que usa lucene como almacenamiento de índice, y le proporcionará las capacidades de búsqueda de Lucene como una bonificación. Puede ser más fácil de usar. Ciertamente, es más flexible y mejor API. Pero deberías ver los gastos generales de almacenamiento.

Dependiendo de su necesidad, puede activar Full Text Search en SQL Server, lo que le brinda capacidades adicionales de consulta de SQL. De esta forma, no necesita administrar otro índice fuera de los datos de su base de datos. Si sus datos se encuentran en varios repositorios, usar un índice externo como Lucene podría ser un mejor enfoque.

Al igual que para otros motores de búsqueda de texto completo, tiene Microsoft Search Server Express, pero es posible que tenga que crear su propio conector de contenido para obtener los datos (de nuevo dependiendo de sus repositorios).

+0

@jfar: Edité mi respuesta para reflejar esto. Sigo pensando que usar RavenDB como reemplazo de Lucene directamente es una opción debido a las API que proporciona. –

+0

actualizó mi voto y eliminó el comentario para reflejar su edición;) – jfar

0

simplemente diciendo "el uso de texto completo" no es suficiente. Su solución no es necesariamente tener una búsqueda de texto más avanzada dentro de cada tipo de entidad. Necesita poder consultar el índice para cualquier tipo de entidad en función de la cadena de consulta. Pude ver el uso de NHibernate.Search como el método para completar un índice de Lucene, pero no sé si las capacidades de él permiten realizar búsquedas en el índice independientemente del tipo de documento de índice (se conserva la clase NHibernate). Por lo tanto, es posible que tenga que consultar el índice de Lucene de forma más directa e interpretar los resultados para visualizar o recuperar directamente el objeto subyacente en la base de datos SQL Server a través de NHibernate.

Cuestiones relacionadas