В моем приложении у меня есть таблица пользователей, с first_name
и last_name
. В настоящее время у меня есть третий столбец full_name
(автоматически сгенерированный): first_name + last_name + first_name (без специальных символов).Fuzzy autocomplete
"Etienne", "De Crécy", "Etienne De Crecy Etienne"
На сейчас, у меня есть простой алгоритм для автозавершения ввода пользователя (специальные символы удалены):
SELECT * FROM users WHERE full_name LIKE "%input%"
Этот запрос возвращает Этьена с входами Crécy Etienne
, Etienne De
, Cré
, Cre
, Etienne
Я хочу добавить fuzzy в этом запросе, чтобы пользователи могли ошибаться. Этот новый алгоритм должен иметь возможность вернуться Этьена, когда пользователи пишут:
Etiene
(похоже на имя)Etienne Crecy
(по аналогии с полным именем, без particule)Crecy Etienne
(по аналогии с полным именем, без particule, другое направление)De Cressi
(звучит как фамилия)Cressi
(звучит как фамилия, без particule)
Я делаю много поисков, наиболее актуальной идеей является использование метода SOUNDEX
(или Metaphone
процедур), или levenstein
процедур. Я не могу использовать его как это, потому что:
- Саундэкс основан на первой букве, то
SOUNDEX(Cressy)
не то же самое, какSOUNDEX(De cressy)
, даже если они очень похожи. - Метафон является базовым положением букв (начинающий «kn» походит на «n», но только в первом положении)
- levenstein не заботится о длине строки: De Cressy не похож Кресси.
Есть ли у вас какие-либо идеи о «смешивании» тезисов, или у вас есть какая-либо другая идея для меня?