Комментарии 77
Чувачок, ты объяснил так просто такую хрень )))
отлично!
замечательная статья, все бы такие были.
заинтересовало очень.
замечательная статья, все бы такие были.
заинтересовало очень.
Правда интересно и доходчиво написано!
Да, саундекс отличная штука. Позволяет не геморроиться со всякими там стеммерами и прочими морфологическими приблудами.
Вообще мне вот интересно, как, допустим, яндекс режет приставки, падежи и т.д., наверняка же где-то есть и эти алгоритмы. Стеммер Портера не предлагать :)
Вообще мне вот интересно, как, допустим, яндекс режет приставки, падежи и т.д., наверняка же где-то есть и эти алгоритмы. Стеммер Портера не предлагать :)
Это называется "поиск с учетом морфологии". Есть несколько таких готовых движков, сам яндекс свой раздает. А можно написать и что-то подобное самому.
Про яндекс то я в курсе, просто это некая программулина, а не набор скриптов, соответственно на шаред хостинге не факт, что заработает как надо. А вот за вторую ссылку спасибо, почитаю.
Если я не ошибаюсь, то на яндексе есть и сорс всего этого, и порты под разные системы. Тем более, сделать обработчик готовой проги не так сложно. Она ж там на си написана.
Еще раз повторюсь: не уверен в том, что только что написал, надо скачать и смотреть. Просто с годик назад качал и запускал на хостинге спокойно
Еще раз повторюсь: не уверен в том, что только что написал, надо скачать и смотреть. Просто с годик назад качал и запускал на хостинге спокойно
посмотрите на сфинкс.
он "из коробки" умеет морфологию русского и английского, мы достаточно просто добавили и украинский.
он "из коробки" умеет морфологию русского и английского, мы достаточно просто добавили и украинский.
Он не подойдет для shared-хостинга.
Кстати, а в сфинксе есть поиск по фразе (типа как если в "ковычки" слова в гугле взять) ?
Кстати, а в сфинксе есть поиск по фразе (типа как если в "ковычки" слова в гугле взять) ?
да, вы правы, для виртуального проще использовать работу со словарями прямо в mysql, примерно как это описано у вас во второй ссылке. так тоже работали ) пока не понадобился украинский. с ним больше проблем из-за морфологического изменения корня слова в существительных.
поиск по фразе есть, насколько помню, но лучше посмотреть документацию, как именно это делается.
поиск по фразе есть, насколько помню, но лучше посмотреть документацию, как именно это делается.
Поясню, что спросил об этом не случайно. Этот вопрос для меня действительно сейчас актуален. Вот в том поиске, который с версии 8.3 вшит в Postgres, нету поиска фраз. Я уже посмотрел в мануале, есть в нем фразовый поиск, да. Это гуд.
Шаред конечно не требование, но большинство клиентов вряд ли разорятся на хотя бы VPS/VDS.
НЛО прилетело и опубликовало эту надпись здесь
Респект, отличная статья.
Реально, полезная вещь... А ведь можно этот поиск как-то и семантическим сделать
хеширование слов %\
Какой позитив с утра =)
Спасибо за статью.
Спасибо за статью.
Респект. Былаб возможность - добавил бы плюсов.
НЛО прилетело и опубликовало эту надпись здесь
Вторая хорошая статья на хабре за последние сутки.
Спасибо огромное.
Вот теперь думаю, как бы это реализовать в MySQL.
Спасибо огромное.
Вот теперь думаю, как бы это реализовать в MySQL.
Ну, самый простой и прямой вариант перевесить на мускул - считать коды на пхп, а в мускул пихать fulltext-индекс, затем искать binary fulltext в виде match (fulltext_key) against ('+845747 +773644' in boolean mode)
а если совсем хочется глубоко закопаться - можно на процедурах сделать
а если совсем хочется глубоко закопаться - можно на процедурах сделать
Ясность изложения говорит о большом понимании автором.
А то вечно напишут что-то запутанное, а потом делают вид, что шарят :)
Побольше бы таких замечательных статей!
А то вечно напишут что-то запутанное, а потом делают вид, что шарят :)
Побольше бы таких замечательных статей!
Раз уж статья опубликована в разделе PHP, то, думаю, едва ли можно обидеть вниманием такую замечательную встроенную PHP-функцию, как metaphone() - собственно, реализация уже упомянутого алгоритма Metaphone. Есть еще такая реализация, как double metaphone (можно взять на http://swoodbridge.com/DoubleMetaPhone/). Она хоть и точнее, но работает, правда, помедленнее. Сама же функция metaphone - весьма шустрая, предназначена, к сожалению, только для латиницы, так что, без транслита все же не обойтись :(
Отличное решение сложной проблемы!
спасибо большое за интересную и простую подачу такого, казалось бы, туманного алгоритма.
кто набрался смелости посчитать циферки для чака норриса — отпишитесь. страшно запускать.
кто набрался смелости посчитать циферки для чака норриса — отпишитесь. страшно запускать.
полезная и хорошо написанная статья! спасибо!
Пять баллов.
Отлично написано, и все понятно. Автору плюсеги и спасибо :)
Попробую поставить к себе в поиск на аукцион фолбэкомм. У меня около 20% запросов с ошибками и еще 10% необходимо транслитирировать.
респектище! вот только возник вопрос, а что с умляутами? там в таблице только пару букв с закорючками. я так понимаю, должна быть где-то табличка замены всех этих буковок с точками/черточками на стандартную латиницу?
С нокией незадача.
нокия: 654000
nokia: 650000
Может надо еще эти ия иа учитывать?
нокия: 654000
nokia: 650000
Может надо еще эти ия иа учитывать?
Да, есть некоторые исключения, но это легко подогнать под задачу - чуть усовершенствовать функцию транслитерации, чтобы двойной звук "й" после гласной не кодировать - из звучащего в транслите nokija/нокийа должно получится nokia/нокиа. Оставляю тюнинг на усмотрение тех, кто захочет попробовать этот поиск. )
Для Perl есть готовый модуль Text::Phonetic::DaitchMokotoff
Так вот там, результат не код, а массив кодов (потому что "Some strings in the Daitch-Mokotoff algorithm produce ambigous results"). Для транслитерированного "нокия" результат - 2 кода: 654000 и 650000.
Так вот там, результат не код, а массив кодов (потому что "Some strings in the Daitch-Mokotoff algorithm produce ambigous results"). Для транслитерированного "нокия" результат - 2 кода: 654000 и 650000.
Да, можно выдавать оба возможных варианта - если кому-то захочется, можно приписать пару строк. Мне проще работать с теми языками, на которых я умею говорить, поэтому сделал, как сделал.
Ну, честно говоря непонятно, почему вы при транслитерации меняете Й на J, а далее как русский аналог J у вас выступает DZH. Правильнее тогда-бы пожалуй было транслитерировать Й в другую букву (последовательность букв).
Так я о том и написал четырьмя коментами выше. Почему - потому что мне на тот момент было выгоднее, чтобы Johnson == Джонсон, а не Johnson == Йонсон. Т.е. надо или тюнить транслит, или сами коды, или выдавать несколько возможных вариантов (последнее - правильный подход, но учитывая, что такой поиск используется, как фолбэк, когда нет точных совпадений, все в меру разумно... и Bill/Paul по той же причине я не рассматривал, потому что по таким вещам обычно не опечатываются и редко ищут - короткий запрос. А вот по MacCartnie, McCartney, Маккартни, Мокартни - самое то )). Спасибо за коменты, радует то, что многим все-таки не лень разобраться в теме.
В самой таблице (не в коде, а в html-таблице) я все же оставил оба возможных варианта для референса...
Johnson = Джонсон - вопросов нет:) Если вариант с несколькими кодами не прокатывает, то тюнить надо функцию транслит. Я у себя кроме й->j еще кое какие варианты затюнил.
По поводу Bill/Paul это еще что, я вот на повеселее вариант наткнулся.
Есть такая актриса Zawieruszanka (479465). Так вот Schwarzenegger (479465) ее фонетический родственник:)
По поводу Bill/Paul это еще что, я вот на повеселее вариант наткнулся.
Есть такая актриса Zawieruszanka (479465). Так вот Schwarzenegger (479465) ее фонетический родственник:)
Очень нравятся статьи написаны в доходчивой форме как эта )
Спасиба!
Спасиба!
Спасибо большое за ликбез!
преподнесено в меру вульгарно и весьма доходчиво, читалось легко. Спасибо )
НЛО прилетело и опубликовало эту надпись здесь
А я когда-то читал про русский Soundex здесь http://community.livejournal.com/ru_php/…
Блин =)
Привинтил к поиску на сайте. Решил поискать.
Набрал, естественно, слово «хуй». Вылетел эксэпшон.
Методом научного тыка установил, что функция работает, если строка содержит пять или больше символов.
Сейчас попробую разобраться, почему так.
Привинтил к поиску на сайте. Решил поискать.
Набрал, естественно, слово «хуй». Вылетел эксэпшон.
Методом научного тыка установил, что функция работает, если строка содержит пять или больше символов.
Сейчас попробую разобраться, почему так.
От четырех символов, если быть точным. Большинство слов до 4 символов не нуждаются в поддержке со стороны такого поиска, потому что либо достаточно коротки, чтобы быть написанными без опечаток, либо попадают в разряд "stopwords" (артикли, предлоги, местоимения и всякие другие короткие слова). В принципе, все это можно тюнинговать, там в коде эти ограничения видны. Ваше, в частности, надо поменять в preg_replace
Неприлично же) Хоть бы звёздочку поставили =)
Это прям нереально крутая штуковина, господа!
Будем думать и внедрять)
Будем думать и внедрять)
Вы меня, конечно, извините. Но я не понял как вы осуществили поиск? Не добавили же дополнительные поля в DB, где весь текст был в кодах, и по нему осуществлялся бы поиск.
НЛО прилетело и опубликовало эту надпись здесь
Очень интересно, только исходник функций пропал куда-то.
Сэр, благодарю за интересный пост!
Спасибо!
Интересненькое дело!
Будет необходимость - поиграюсь!
Пока что, просто на заметку!
Спасибо! )
Интересненькое дело!
Будет необходимость - поиграюсь!
Пока что, просто на заметку!
Спасибо! )
А у меня опять всё не слава богу. Одни нули теперь показывает.
описание==общение
:(
:(
Никогда бы не догадался, респект :) Но, судя по комментом, много косяков? :) Интересно, как на Yandex и др. сервисах пашет фича "Возможно вы имели ввиду".
Насчет косяков - я там выше написал, что это фолбэк-онли. И применяется в основном к именам собственным.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Фонетический поиск