Я реализовал такую функциональность на одном сайте. Я использую double_metaphone () + levenstein () в PHP. Я предварительно вычисляю double_metaphone () для каждой записи в базе данных, которую я ищу, используя SELECT из первых x символов в поисковом термине «метафонированный».
Затем я сортирую возвращаемый результат по их расстоянию Левенштейна. double_metaphone () не является частью какой-либо библиотеки PHP (последний раз, когда я проверял), поэтому я позаимствовал реализацию PHP, которую я нашел где-то давно в сети (сайт больше не подключен). Я должен опубликовать это где-то, я полагаю.
РЕДАКТИРОВАТЬ: веб-сайт все еще находится в archive.org:
http://web.archive.org/web/20080728063208/http://swoodbridge.com/DoubleMetaPhone/
или кеш Google:
http://webcache.googleusercontent.com/search?q=cache:Tr9taWl9hMIJ:swoodbridge.com/DoubleMetaPhone/+Stephen+Woodbridge+double_metaphon
, что приводит ко многим другим полезным ссылкам с исходным кодом для double_metaphone (), включая ссылку в Javascript на github: http://github.com/maritz/js-double-metaphone
РЕДАКТИРОВАТЬ : Прошел через мой старый код, и вот примерно шаги того, что я делаю, псевдокодировано, чтобы не усложнять:
1) Предварительно вычислить double_metaphone () для каждого слова в базе данных, то есть $ word = 'blahblah'; $ Soundslike = double_metaphone ($ слово);
2) Во время поиска $ word нечетко ищется в базе данных: $ soundslike = double_metaphone ($ word)
4) SELECT * FROM table
WHERE soundlike
LIKE $ soundlike (если levenstein хранится как процедура, намного лучше : SELECT * FROM table WHERE levenstein (soundlike
, $ soundlike ) <мифический порог ORDER BY levenstein (<code>word, $ word) ASC LIMIT ... и т. д.
Это хорошо сработало для меня, хотя я не могу использовать хранимую процедуру, поскольку у меня нет контроля над сервером, и он использует MySQL 4.20 или что-то в этом роде.