2011-12-15 35 views
9

Necesito buscar una colección potencialmente grande de oraciones, y no tengo ni idea de dónde empezar.Escribir el algoritmo de búsqueda de texto completo en C#/Entity Framework - ¿por dónde empezar?

En resumen, un usuario enviará una frase de búsqueda, por ejemplo, "cómo elimino mi cuenta", entonces tengo que ir a la base de datos y hacer una coincidencia con las palabras proporcionadas.

En este momento estoy pensando en hacer algo como lo siguiente: frase

  • Split a palabras individuales
  • eliminar palabras muy frecuentes (y, de ser, etc)
  • orden alguna manera las palabras por prioridad (ni idea de cómo hacer esto aún)
  • Usando bucle EF a través de palabras, haciendo un String.Contains en cada db registro y la palabra
  • Si no hay resultados, eliminar algunas de la lO wer palabras prioritarias y búsqueda de nuevo
  • Repita

¿Alguien podría apuntar en la dirección correcta? Además, si alguien conoce alguna biblioteca para hacer este tipo de trabajo, sería genial.

Saludos

+5

¿Realmente desea escribir la búsqueda de texto completo, o está utilizando una suficiente? Si usarlo es suficiente, puedes lanzar Lucene.net al problema. – CodesInChaos

+0

Preferiría usar uno que no sea el correcto – jcvandan

+0

Sin embargo, preferiría que la búsqueda ocurriera en SQL si fuera posible, realmente no quiero devolver un registro completo cada vez que necesito buscar – jcvandan

Respuesta

6

En cuanto a la priorización palabras, una solución sencilla pero muy eficaz es que los clasifique por su popularidad (índice de popularidad tal vez se podría creen en función de artículos en su base de datos), por lo que las palabras que son raros en sus textos son más importantes, de esta forma puedes potenciar palabras que son menos generales.

Otro problema aquí es el hecho de que podría tener palabras en diferentes formas, como tiempo pasado/futuro, por lo tanto podría interesarle stemming, una herramienta que fue portada a C# es proyecto Snowball por lo que recuerdo .

En cuanto a hacer la segunda parte de su problema, recorrer las palabras puede ser muy ineficaz, creo que debería considerar el uso de algunas bibliotecas/soluciones de indexación. Uno, popular para .net es Lucene.Net. Básicamente crea un índice invertido, que asigna ciertas frases (como palabras) a los artículos que las contienen, lo que le permite encontrar rápidamente todas las ocurrencias de palabras en sus textos. Similar approach podría implementarse usted mismo dentro de su base de datos

+0

Voy a echar un vistazo a lucene, ver si es apropiado, thx – jcvandan

2

Use SQL server full text search capability y envuelva la consulta utilizando la búsqueda de texto completo en el procedimiento almacenado. Ejecute el procedimiento almacenado a través de ADO.NET o EF.

3

En caso de que alguien se encuentre con esto y se pregunte qué usé al final, terminé usando Lucene.NET. Es fantástico, muy fácil de configurar y usar, teniendo en cuenta que es tan poderoso y agrega una gran funcionalidad. Sin embargo, una cosa que diría es que la documentación no es excelente. Sin embargo, encontré una serie de tutoriales here que es una buena introducción. Pasé una mañana repasando estos artículos y tuve una indexación/búsqueda de texto completo ridículamente rápida en mi aplicación.

+3

Si su problema se resolvió debido al esfuerzo de @Ravadre, debería considerar marcar la respuesta proporcionada como correcta, no su propio informe final de éxito. Esto los recompensa por el tiempo que dedican a ayudarlo a encontrar esta solución. De lo contrario, te estás dando palmaditas en la espalda para que otros te ayuden. : -o – BenSwayne

+0

yeh verdad, no sé por qué hice eso ?! – jcvandan

Cuestiones relacionadas