Сортировать по Soundex (или аналогичному) `Closeness`

Есть ли способ упорядочить результаты MySQL по тому, насколько они «звучат» по отношению к поисковому запросу?

Я пытаюсь упорядочить поля, которые содержат вводимые пользователем названия городов. Существуют вариации и орфографические ошибки, и я хотел бы показать «самые близкие» совпадения вверху.

Я знаю, что soundex может быть не лучшим алгоритмом для этого, но если он (или другой метод) может быть достаточно успешным - возможно, стоит выполнить сортировку с помощью базы данных.


person Tim Lytle    schedule 20.10.2010    source источник


Ответы (1)


Soundex не подходит для такого рода вещей, потому что разные слова могут дать вам одинаковые результаты Soundex и, следовательно, будут произвольно сортировать. Лучшим решением для этого является алгоритм Levenshein Edit Distance, и вы можете реализовать его как функцию в своей базе данных: Ссылка на Levensheint impl. как хранимая функция MySql !!!

Вы также можете проверить эту ссылку SO. Он содержит реализацию алгоритма на сервере Sql (специфичную для T-SQL), но должен иметь возможность переноса. Механика алгоритма довольно проста: нужен только 2D-массив и цикл по строке.

person Paul Sasik    schedule 20.10.2010
comment
Я смотрел на Левенштейна, если мне приходилось производить сортировку в коде. Похоже, это взвешивание реализации правильного алгоритма в базе данных или использование того же алгоритма, который уже доступен на стороне кода. - person Tim Lytle; 20.10.2010
comment
Если вы реализуете его как функцию MySql (ссылка в ответе), вы сможете сделать это в своем SQL. Что-то вроде: SELECT CityName, Leven (CityName, compString) FROM City ORDER BY Leven (CityName, compString) - person Paul Sasik; 20.10.2010
comment
@Rinzler: Да, этому посту почти два года. Ссылки исчезают. В любом случае, я нашел еще один пример реализации MySql и повторно связал его. - person Paul Sasik; 12.09.2012
comment
спасибо, мой друг, можешь ли ты найти мне реализацию soundex в zend framework - person Rinzler; 13.09.2012
comment
@Rinzler: ознакомьтесь с этой страницей руководства PHP для работы с Levenshtein: php.net/manual/ ru / function.levenshtein.php Я не знаком с Zend, но вы должны уметь использовать алгоритм. - person Paul Sasik; 13.09.2012