С metaphone() я уже сделал вариант.
Добавил еще одно поле в таблицу, заполнил его значениями metaphone(word) и, если надо, выбираю по нему. Однако, работает это все далеко не так хорошо как хотелось бы. А именно - некоторые простые опечатки так искажают произношение, что не отлавливаются методом использующим metaphone(). Например, на запрос "manson" мой словарик не предложил ни одного варианта, ни "mason", ни "mansion", в то время как yandex.lingvo предлагает более 30 вариантов, из которых по крайней мере половина у меня в базе имеется.
Видимо, надо придумать способ быстро сравнивать запрос со всеми сотнями тысяч слов при помощи левенштейнов, симилар текста и др.
