Question

Le problème est qu’il existe une base de données contenant environ 20 000 enregistrements de clients et je souhaite faire tout ce qui est en mon pouvoir pour éviter les entrées en double. La base de données est Microsoft SQL Server 2005, l’application qui la maintient est Microsoft Dynamics / SL. Je crée un service Web ASP.NET qui interagit avec cette base de données. Mon service peut insérer des enregistrements de clients dans la base de données, en lire des enregistrements ou les modifier. Que ce soit dans mon service Web, via MS Dynamics ou dans Sql Server, j'aimerais vous fournir une liste des correspondances possibles avant qu'un utilisateur ne confirme l'ajout d'un nouvel enregistrement.

Ainsi, l’utilisateur soumettrait un enregistrement, s’il semble être unique, il enregistre et renvoie un nouvel ID. S'il y a des doublons possibles, l'utilisateur peut alors soumettre à nouveau une confirmation: "Oui, je vois les doublons possibles, il s'agit d'un nouvel enregistrement et je souhaite le soumettre".

C’est facile s’il s’agit simplement d’une ponctuation ou d’un signe d’espace (par exemple, si vous entrez "Company, Inc." et qu’il existe une "Company Inc" dans la base de données. tels que "Company Corp." au lieu de "Company Inc" ou s'il y a une faute d'orthographe à gros doigts, telle que "Cmpany, Inc." Est-il même possible de renvoyer de tels enregistrements dans la liste? Absolument pas possible, je traiterai de ce que j’ai. Cela ne fera que créer plus de travail ultérieurement, si des enregistrements doivent être fusionnés en raison de duplications.

Était-ce utile?

La solution

Les détails de ce que algorithme seront Le travail qui vous convient le mieux dépend beaucoup de votre domaine. Je vous conseillerais donc d’en expérimenter plusieurs. Vous devrez peut-être en combiner plusieurs pour obtenir des résultats optimaux. Les abréviations, en particulier celles spécifiques à un domaine, doivent également être prétraitées ou normalisées.

Pour les noms, il serait probablement préférable d'utiliser un algorithme phonétique - qui prend en compte la prononciation. Cela va rapprocher Smith et Schmidt, car ils sont faciles à confondre quand en disant les mots. Le le double métaphone est un bon premier choix.

Pour les gros doigtés, il serait probablement préférable d'utiliser un algorithme modifier la distance - ce qui donne une "différence" entre 2 mots. Celles-ci rapprocheraient Smith et Smoth l'un à la suite de l'autre, même si le 2 risque de glisser de la recherche phonétique.

T-SQL contient SOUNDEX et DIFFERENCE - mais ils le sont assez pauvre. Une variante Levenshtein est le choix canonique, mais il existe d'autres bons choix - dont la plupart sont assez faciles implémenter en C #, si vous ne trouvez pas d'implémentation sous licence appropriée.

Tout cela sera beaucoup plus facile à coder / utiliser depuis C # que T-SQL (bien que j'ai trouvé double métaphone dans un abus abominable de T-SQL pouvant fonctionner en SQL).

Bien que cet exemple se trouve dans Access (et je n'ai jamais regardé le code, ou utilisé la mise en œuvre), la présentation incluse donne une assez bonne idée de ce que vous devrez probablement faire. Le code vaut probablement le coup d’oeil, et peut-être un port de VBA.

Autres conseils

Recherchez SOUNDEXing dans SQL Server. Je pense que cela vous donnera le flou des correspondances probables que vous recherchez.

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

S'il est possible d'intégrer Lucene.NET dans votre solution, vous devez absolument l'essayer. out.

Vous pouvez essayer d’utiliser la recherche en texte intégral avec les fonctions FreeText (ou FreeTextTable) pour rechercher les correspondances possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top