J'ai une table de base de données Microsoft SQL Server avec environ 7 millions d'enregistrements de sources multiples, contenant principalement une valeur de nom de chaîne avec des détails connexes. Pour presque tous les enregistrements, il semble qu'il y ait une douzaine d'enregistrements de typo similaires et j'essaie de faire des correspondances floues pour identifier des groupes d'enregistrements tels que "Apple", "Aple", "Pommes", "Spple", etc. contenir plusieurs mots avec des espaces entre eux. J'ai proposé une solution d'utilisation d'une fonction scalaire edit-distance qui retourne le nombre de touches nécessaires pour la transformation de string1 en string2 et en utilisant cette fonction pour rejoindre la table à elle-même. Comme vous pouvez l'imaginer, cela ne fonctionne pas bien car il faut exécuter la fonction des millions de fois pour évaluer une jointure. Donc, je mets cela dans un curseur pour qu'au moins une seule chaîne1 soit évaluée à la fois, cela obtient au moins des résultats mais après l'avoir laissé pendant des semaines, elle n'a réussi qu'à évaluer 150 000 enregistrements. Avec 7 millions à évaluer, je ne pense pas avoir le temps que ma méthode va prendre. J'ai mis des index de texte intégral sur les noms de chaîne, mais je n'ai pas vraiment trouvé un moyen d'utiliser les prédicats de texte intégral quand je n'avais pas une valeur statique que je recherchais.Comment trouver des lignes dans un tableau avec des valeurs de chaîne similaires
Des idées comment je pourrais faire quelque chose comme le suivant d'une manière qui ne prendrait pas des mois à courir?
SELECT t1.name, t2.name
FROM names AS t1
INNER JOIN names AS t2
ON EditDistance(t1.name,t2.name) = 1
AND t1.id != t2.id
Cette question m'a rappelé la fonction [soundex] (https://technet.microsoft.com/en-us/library/ms189282 (v = sql.105) .aspx). – LukStorms
Eh bien, le problème avec votre requête est que c'est presque comme une jointure cartésienne. Un 7 millions de croix se rejoignent sur 7 millions. Et sans possibilité d'utiliser un index. Aie. Peut-être que vous devriez créer une table avec tous les mots du dictionnaire connus. Et utilisez ce dictionnaire pour sélectionner uniquement les mots inconnus de votre table. – LukStorms
Oui, la jointure cartésienne est définitivement le problème.L'approche du dictionnaire semble intéressante, mais une autre difficulté est que les noms sont en plusieurs langues et peuvent littéralement contenir n'importe quel mot ou combinaison de mots dans ces langues. Je ne suis pas sûr de pouvoir obtenir une source définitive à utiliser comme dictionnaire. – kscott