Mysql
 sql >> Database >  >> RDS >> Mysql

Come faccio a eseguire una corrispondenza fuzzy dei nomi delle società in MySQL con PHP per il completamento automatico?

Puoi iniziare usando SOUNDEX() , questo probabilmente farà ciò di cui hai bisogno (immagino una casella di suggerimento automatico di alternative già esistenti per ciò che l'utente sta digitando).

Gli svantaggi di SOUNDEX() sono:

  • la sua incapacità di differenziare stringhe più lunghe. Vengono presi in considerazione solo i primi caratteri, stringhe più lunghe che divergono alla fine generano lo stesso valore SOUNDEX
  • il fatto che la prima lettera deve essere la stessa o non troverai facilmente una corrispondenza. SQL Server ha la funzione DIFFERENCE() per dirti quanto due valori SOUNDEX sono separati, ma penso che MySQL non abbia nulla di quel tipo integrato.
  • per MySQL, almeno secondo il documenti , SOUNDEX è interrotto per l'input Unicode

Esempio:

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

/* all of these return 'M262' */

Per esigenze più avanzate, penso che tu debba dare un'occhiata alla distanza di Levenshtein (chiamato anche "modifica distanza") di due stringhe e lavora con una soglia. Questa è la soluzione più complessa (=più lenta), ma consente una maggiore flessibilità.

Lo svantaggio principale è che sono necessarie entrambe le stringhe per calcolare la distanza tra di loro. Con SOUNDEX puoi memorizzare un SOUNDEX precalcolato nella tua tabella e confrontare/ordinare/raggruppare/filtrare su quello. Con la distanza di Levenshtein, potresti scoprire che la differenza tra "Microsoft" e "Nzcrosoft" è solo 2, ma ci vorrà molto più tempo per arrivare a quel risultato.

In ogni caso, una funzione di distanza Levenshtein di esempio per MySQL può essere trovata su codejanitor.com:Distanza di Levenshtein come funzione memorizzata MySQL (10 febbraio 2007) .