Możesz zacząć od użycia SOUNDEX()
, prawdopodobnie zrobi to, czego potrzebujesz (wyobrażam sobie pole autosugestii z już istniejącymi alternatywami dla tego, co pisze użytkownik).
Wady SOUNDEX()
są:
- jego niezdolność do rozróżniania dłuższych ciągów. Tylko kilka pierwszych znaków jest branych pod uwagę, dłuższe ciągi, które rozchodzą się na końcu, generują tę samą wartość SOUNDEX
- fakt, że pierwsza litera musi być taka sama, w przeciwnym razie nie będzie łatwo znaleźć dopasowania. SQL Server ma funkcję DIFFERENCE(), która mówi, jak bardzo różnią się dwie wartości SOUNDEX, ale myślę, że MySQL nie ma nic takiego wbudowanego.
- dla MySQL, przynajmniej według dokumenty , SOUNDEX jest uszkodzony dla wejścia Unicode
Przykład:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
W przypadku bardziej zaawansowanych potrzeb myślę, że należy spojrzeć na odległość Levenshtein (zwane także „edycją odległości”) dwóch ciągów i pracy z progiem. Jest to bardziej złożone (=wolniejsze) rozwiązanie, ale zapewnia większą elastyczność.
Główną wadą jest to, że do obliczenia odległości między nimi potrzebne są oba struny. Dzięki SOUNDEX możesz przechowywać wstępnie obliczony SOUNDEX w swojej tabeli i na tej podstawie porównywać/sortować/grupować/filtrować. Z odległością Levenshteina może się okazać, że różnica między „Microsoft” a „Nzcrosoft” wynosi tylko 2, ale osiągnięcie tego wyniku zajmie dużo więcej czasu.
W każdym razie przykładową funkcję odległości Levenshteina dla MySQL można znaleźć pod adresem codejanitor.com:Levenshtein Distance jako funkcja przechowywana w MySQL (10 lutego 2007) .