9
votes

Écrire un algorithme de recherche en texte intégral dans le cadre C # / entité - Où commencer?

J'ai besoin de rechercher une collection potentiellement importante de phrases, et je ne sais pas où commencer.

En résumé, un utilisateur soumettra une phrase de recherche, par exemple "Comment supprimer mon compte", j'ai alors besoin d'aller à la DB et de faire une correspondance avec les mots fournis.

Pour le moment je pense à faire quelque chose comme ce qui suit:

  • Split Phrase aux mots individuels
  • supprimer des mots très courants (et, si, etc.)
  • en quelque sorte commandez des mots par priorité (aucune idée de la façon de le faire)
  • en utilisant une boucle EF par des mots, faire une chaîne.Contains sur chaque dB Enregistrement et mot
  • Si aucun résultat n'a été trouvé, supprimez certaines des mots de priorité inférieure et Rechercher à nouveau
  • Répéter

    Quelqu'un pourrait-il me dire dans la bonne direction? En outre, si quelqu'un connaît des bibliothèques pour faire ce genre de travail qui serait génial.

    acclamations


3 commentaires

Voulez-vous vraiment écrire une recherche complète ou utilise-t-on assez? Si vous utilisez c'est assez, vous pouvez lancer Lucene.net au problème.


Je préférerais beaucoup utiliser une seule que la droite


Cependant, je préférerais que la recherche se produise dans SQL si possible, je ne veux pas vraiment retourner un jeu d'enregistrement complet que j'ai besoin de chercher


3 Réponses :


6
votes

Quant à la priorité des mots, une solution simple mais assez efficace consiste à les trier par leur popularité (peut-être que l'indice de popularité pourrait être créé en fonction des articles de votre base de données), de sorte que les mots qui sont rares dans vos textes sont plus importants, de cette façon Vous pouvez augmenter les mots moins généraux.

Autre problème ici est le fait que vous pourriez avoir des mots sous différentes formes, comme le passé / futur tendu, vous pourriez donc être intéressé par stemming eux, un outil porté à C # est un projet de boule de neige aussi loin que je me souviens.

En ce qui concerne la deuxième partie de votre problème, la boucle via des mots peut être très inefficace, je pense que vous devriez envisager d'utiliser certaines bibliothèques / solutions d'indexation. Un, populaire pour .NET est lucene.net . Il crée essentiellement l'indice inversé, qui mesure certaines phrases (comme des mots) aux articles qui les contiennent, ce qui vous permet de trouver rapidement toutes les occurrences de mots donnés dans vos textes. Similaire approché pourrait être mis en œuvre par vous-même dans votre base de données


1 commentaires

Je vais jeter un coup d'œil à Lucene, voir si c'est approprié, merci



2
votes

Utilisez Capacité de recherche de texte complète SQL Server et enveloppez la requête en utilisant Recherche de texte complète à la procédure stockée. Exécuter la procédure stockée soit via ado.net ou ef.


0 commentaires

3
votes

Juste au cas où n'importe qui apparaît à travers cela et se demanda ce que j'ai utilisé à la fin, j'ai fini par utiliser Lucene.net. C'est fantastique, très facile à configurer et à utiliser le considérant si puissant et ajoute une telle fonctionnalité. Une chose que je dirais, c'est que la documentation n'est pas géniale. Cependant, j'ai trouvé une série de tutoriels Ici c'est une bonne introduction. J'ai passé une matinée à travers ces articles et j'avais ridiculement une indexation rapide du texte complet / à la recherche dans mon application!


2 commentaires

Si votre problème a été résolu en raison de l'effort de @Ravadre, vous devriez envisager de marquer la réponse fournie comme étant correcte et non votre propre rapport final de réussite. Cela les récompense pour le moment où ils montent pour vous aider à trouver cette solution. Sinon, vous ne faites que bavarder sur le dos pour que d'autres aident. : -O


Yeh True, je ne sais pas pourquoi j'ai fait ça ?!