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

Hvordan laver jeg en fuzzy match af firmanavne i MYSQL med PHP til autofuldførelse?

Du kan starte med at bruge SOUNDEX() , dette vil sandsynligvis gøre det, du har brug for (jeg ser en automatisk forslagsboks med allerede eksisterende alternativer til det, brugeren skriver).

Ulemperne ved SOUNDEX() er:

  • dets manglende evne til at differentiere længere strenge. Kun de første par tegn tages i betragtning, længere strenge, der divergerer i slutningen genererer den samme SOUNDEX-værdi
  • det faktum, at det første bogstav skal være det samme, ellers vil du ikke let finde et match. SQL Server har DIFFERENCE()-funktion til at fortælle dig, hvor meget to SOUNDEX-værdier er fra hinanden, men jeg tror, ​​at MySQL ikke har noget af den slags indbygget.
  • for MySQL, i det mindste ifølge denne dokumenter , SOUNDEX er ødelagt for unicode-input

Eksempel:

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

/* all of these return 'M262' */

For mere avancerede behov, tror jeg, du skal se på Levenshtein-afstanden (også kaldet "rediger afstand") af to strenge og arbejde med en tærskel. Dette er den mere komplekse (=langsommere) løsning, men den giver mulighed for større fleksibilitet.

Den største ulempe er, at du skal bruge begge strenge for at beregne afstanden mellem dem. Med SOUNDEX kan du gemme en forudberegnet SOUNDEX i din tabel og sammenligne/sortere/gruppere/filtrere på det. Med Levenshtein-distancen vil du måske opdage, at forskellen mellem "Microsoft" og "Nzcrosoft" kun er 2, men det vil tage meget mere tid at nå frem til det resultat.

Under alle omstændigheder kan et eksempel på Levenshtein-afstandsfunktion til MySQL findes på codejanitor.com:Levenshtein Distance som en MySQL-lagret funktion (10. februar 2007) .



  1. SQL Server Tutorial – Alt hvad du behøver for at mestre Transact-SQL

  2. Hvordan kan jeg sikkerhedskopiere en ekstern SQL Server-database til et lokalt drev?

  3. Er der en indlejringsgrænse for korrelerede underforespørgsler i nogle versioner af Oracle?

  4. Sådan konverteres til store bogstaver i MariaDB