Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je faire une correspondance floue des noms de société dans MYSQL avec PHP pour la saisie semi-automatique ?

Vous pouvez commencer par utiliser SOUNDEX() , cela suffira probablement pour ce dont vous avez besoin (j'imagine une boîte à suggestions automatique d'alternatives déjà existantes pour ce que l'utilisateur tape).

Les inconvénients de SOUNDEX() sont :

  • son incapacité à différencier les chaînes plus longues. Seuls les premiers caractères sont pris en compte, les chaînes plus longues qui divergent à la fin génèrent la même valeur SOUNDEX
  • le fait que la première lettre doit être la même ou vous ne trouverez pas de correspondance facilement. SQL Server a la fonction DIFFERENCE() pour vous dire à quel point deux valeurs SOUNDEX sont séparées, mais je pense que MySQL n'a rien de ce genre intégré.
  • pour MySQL, au moins selon le documentation , SOUNDEX est cassé pour l'entrée unicode

Exemple :

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Pour des besoins plus avancés, je pense que vous devez regarder la distance de Levenshtein (également appelée "distance d'édition") de deux chaînes et fonctionne avec un seuil. C'est la solution la plus complexe (=la plus lente), mais elle permet une plus grande flexibilité.

Le principal inconvénient est que vous avez besoin des deux chaînes pour calculer la distance qui les sépare. Avec SOUNDEX, vous pouvez stocker un SOUNDEX pré-calculé dans votre tableau et comparer/trier/grouper/filtrer sur celui-ci. Avec la distance de Levenshtein, vous constaterez peut-être que la différence entre "Microsoft" et "Nzcrosoft" n'est que de 2, mais il faudra beaucoup plus de temps pour arriver à ce résultat.

Dans tous les cas, un exemple de fonction de distance Levenshtein pour MySQL peut être trouvé sur codejanitor.com :Distance de Levenshtein en tant que fonction stockée MySQL (10 février 2007) .