8
votes

Écrire un indice inversé en C # pour une demande de récupération d'informations

J'écris une application interne qui contient plusieurs informations de texte ainsi qu'un certain nombre de données sur ces pièces de texte. Ces données seront conservées dans une base de données (SQL Server, bien que cela puisse changer) par ordre d'entrée.

J'aimerais pouvoir rechercher le plus pertinent de ces informations, le plus pertinent de ceux-ci pour être en haut. Je suis initialement examiné à l'aide de la recherche en texte intégral SQL Server, mais elle n'est pas aussi flexible pour mes autres besoins que j'avais espéré, il semble donc que j'ai besoin de développer ma propre solution à cela.

De ce que je comprends ce qui est nécessaire est un Index inversé < / a>, alors que le contenu dudit indice inversé soit restauré et modifié en fonction des résultats des informations supplémentaires détenus (bien que cela puisse maintenant être laissé à une date ultérieure, car je veux juste que l'indice inversé indice le texte principal. de la table de base de données / chaînes fournies).

J'ai eu une fissure à écrire ce code en Java en utilisant une haquetable avec la clé que les mots et la valeur en tant que liste des occurrences du mot, mais dans toute l'honnêteté, je suis toujours plutôt nouveau au C # et que j'ai Seulement réellement utilisé des objets tels que des jeux de données et des datables lors de la manipulation des informations. Si demandé, je téléchargerai le code Java bientôt une fois que j'ai effacé cet ordinateur portable de virus.

Si donné un ensemble d'entrées d'une table ou d'une liste des chaînes, comment créer une index inversée en C # qui enregistrera de préférence dans un jeu de données / datatable?

EDIT: J'ai oublié de mentionner que j'ai déjà essayé Lucene et Nutch, mais j'ai besoin de ma propre solution car la modification de Lucene à répondre à mes besoins prendrait beaucoup plus longtemps que de rédiger un indice inversé. Je manipulerai beaucoup de méta-data qui nécessitera également une manipulation une fois que l'indice inversé de base est terminé. Tout ce que j'ai besoin pour l'instant est une recherche de texte intégral de base sur une zone à l'aide de l'indice inversé. Enfin, travailler sur un indice inversé n'est pas quelque chose que je dois faire tous les jours, donc ce serait génial d'avoir une fissure.


1 commentaires

Voici un autre index inversé C # basé sur les génériques: aleandmusic.com/invertedindex.aspx


3 Réponses :


2
votes

Lucene.net pourrait être votre meilleur choix. C'est un moteur de recherche de texte complet mature utilisant Index inversé .

http: // codeclimber .NET.NZ / Archive / 2009/09/02 / Lucene.net-votre-First-Application.aspx

mise à jour:

J'ai écrit une petite bibliothèque pour indexer contre des collections en mémoire à l'aide de Lucene.net - Cela pourrait être utile pour cela. https://github.com/mcintyre321/linqdex


1 commentaires

J'aurais dû expliquer dans ma question que j'avais déjà examiné à l'aide de Lucene ou en remplaçant des parties de sa fonctionnalité avec ce que j'ai écrit. Malheureusement, Lucene n'est pas suffisamment flexible pour que je modifie ce que j'ai besoin de répondre aux critères des informations que j'ai besoin pour tenir, donc je devrai écrire moi-même l'index inversé.



5
votes

Voici un aperçu grossier d'une approche que j'ai utilisée avec succès en C # dans le passé: xxx

notes:

getNextword () itère à travers le champ et les retours le mot suivant et la position. Pour la mettre en œuvre, il s'agit d'utiliser String.indexof () et de caractères de caractères de caractère (ISALPHA, etc.).

getdatabasetextFieldforid () et getdatabaseFields () sont explicatifs, appliquent au besoin.


4 commentaires

Désolé pour le retard énorme pour revenir à cette réponse. Cela a l'air génial! La seule question que j'ai avec cela est la suivante: comment on écrirait alors votre dictionnaire dans une base de données. J'ai édité la question avec ce que je veux dire.


Désolé, je viens de regarder le code et je me suis rendu compte que je pouvais simplement dupliquer les mots qu'ils apparaissent dans plusieurs documents. Il devrait être assez facile d'envoyer ceci à mes cours de manutention de la base de données; Une fois que j'ai mis en œuvre, je vais accepter cette réponse.


@Ender, content que ce soit utile. La sérialisation est une option pour enregistrer / charger des bases de données. Alternativement itération à travers la collection de clés de dictionnaire et que chaque valeur correspondante serait une autre.


J'ai réussi à la mettre en œuvre avec succès en utilisant LINQ pour obtenir chaque valeur, alors j'ai accepté cette réponse. Juste par intérêt, comment auriez-vous implémenté la méthode GetNextWord (), car j'ai divisé le terrain complet en mots distincts et itératés jusqu'à ce qu'ils soient tous partis.



1
votes

Si vous cherchez à tourner le vôtre, le dictionnaire sera probablement votre base, comme vos hashtables Java. En ce qui concerne ce qui est stocké comme les valeurs du dictionnaire, il est difficile à raconter en fonction des informations que vous fournissez, mais de la recherche généralement des algorithmes utilisent un type de structure de jeu afin que vous puissiez exécuter des syndicats et des intersections. LINQ vous donne une grande partie de cette fonctionnalité sur tout ienumerable , bien qu'une classe de jeu spécialisée puisse augmenter les performances.

Une telle implémentation d'un ensemble est dans le Wintellect PowerCollections . Je ne sais pas si cela vous donnerait une prestation de performance ou non sur Linq.

En ce qui concerne l'enregistrement d'un jeu de données , je ne suis pas sûr de ce que vous envisagez. Je ne suis au courant de rien qui écrit automatiquement à un Dataset . Je soupçonne que vous devrez vous écrire vous-même, surtout que vous avez mentionné plusieurs fois à propos d'autres options tierces, n'étant pas suffisamment flexible.


0 commentaires