2010-10-20 4 views
7

Есть ли способ получить результаты заказа MySQL по тому, как близко они« звучат »в поисковом выражении?Сортировать по Soundex (или аналогичный) `Closeness`

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

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

ответ

4

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

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

+0

Я смотрел на Левенштейна, если бы мне пришлось сортировать в коде. Похоже, он взвешивает реализацию * правильного * алгоритма в базе данных или использует тот же алгоритм, который уже доступен на кодовой стороне вещей. –

+0

Если вы реализуете его как функцию MySql (ссылка в ответе), вы должны иметь возможность сделать это в своем SQL. Что-то вроде: SELECT CityName, Leven (CityName, compString) FROM City ORDER BY Leven (CityName, compString) –

+0

@ Rinzler: Да, этому сообщению почти два года. Ссылки исчезают. В любом случае я нашел еще один пример реализации MySql и переделал. –

 Смежные вопросы

  • Нет связанных вопросов^_^