Pull to refresh

Comments 77

Чувачок, ты объяснил так просто такую хрень )))
Бутыльски, осталось нам найти Водкина!
Рюмкин, аналогично и вам )))
может сообразим на троих? ))
Можно с вами? :)
соображайте на троих. только уж на статью интересную соображайте!
отлично!
замечательная статья, все бы такие были.

заинтересовало очень.
Правда интересно и доходчиво написано!
Да, саундекс отличная штука. Позволяет не геморроиться со всякими там стеммерами и прочими морфологическими приблудами.

Вообще мне вот интересно, как, допустим, яндекс режет приставки, падежи и т.д., наверняка же где-то есть и эти алгоритмы. Стеммер Портера не предлагать :)
Это называется "поиск с учетом морфологии". Есть несколько таких готовых движков, сам яндекс свой раздает. А можно написать и что-то подобное самому.
Про яндекс то я в курсе, просто это некая программулина, а не набор скриптов, соответственно на шаред хостинге не факт, что заработает как надо. А вот за вторую ссылку спасибо, почитаю.
Если я не ошибаюсь, то на яндексе есть и сорс всего этого, и порты под разные системы. Тем более, сделать обработчик готовой проги не так сложно. Она ж там на си написана.

Еще раз повторюсь: не уверен в том, что только что написал, надо скачать и смотреть. Просто с годик назад качал и запускал на хостинге спокойно
Нет там сырцов, вы что :) Порты, да, есть.
посмотрите на сфинкс.
он "из коробки" умеет морфологию русского и английского, мы достаточно просто добавили и украинский.
Он не подойдет для shared-хостинга.
Кстати, а в сфинксе есть поиск по фразе (типа как если в "ковычки" слова в гугле взять) ?
да, вы правы, для виртуального проще использовать работу со словарями прямо в mysql, примерно как это описано у вас во второй ссылке. так тоже работали ) пока не понадобился украинский. с ним больше проблем из-за морфологического изменения корня слова в существительных.

поиск по фразе есть, насколько помню, но лучше посмотреть документацию, как именно это делается.
Поясню, что спросил об этом не случайно. Этот вопрос для меня действительно сейчас актуален. Вот в том поиске, который с версии 8.3 вшит в Postgres, нету поиска фраз. Я уже посмотрел в мануале, есть в нем фразовый поиск, да. Это гуд.
Шаред конечно не требование, но большинство клиентов вряд ли разорятся на хотя бы VPS/VDS.
UFO just landed and posted this here
Реально, полезная вещь... А ведь можно этот поиск как-то и семантическим сделать
Какой позитив с утра =)
Спасибо за статью.
 Респект. Былаб возможность - добавил бы плюсов.
UFO just landed and posted this here
Вторая хорошая статья на хабре за последние сутки.
Спасибо огромное.
Вот теперь думаю, как бы это реализовать в MySQL.
Ну, самый простой и прямой вариант перевесить на мускул - считать коды на пхп, а в мускул пихать fulltext-индекс, затем искать binary fulltext в виде match (fulltext_key) against ('+845747 +773644' in boolean mode)
а если совсем хочется глубоко закопаться - можно на процедурах сделать
Не. Я придумал иначе. Сделаю отдельную таблицу, в которой будет айдишник итема и коды названия (ну типа один итем ко многим кодам).
И генерить коды при добавлении нового итема.
Ясность изложения говорит о большом понимании автором.
А то вечно напишут что-то запутанное, а потом делают вид, что шарят :)
Побольше бы таких замечательных статей!
Раз уж статья опубликована в разделе PHP, то, думаю, едва ли можно обидеть вниманием такую замечательную встроенную PHP-функцию, как metaphone() - собственно, реализация уже упомянутого алгоритма Metaphone. Есть еще такая реализация, как double metaphone (можно взять на http://swoodbridge.com/DoubleMetaPhone/). Она хоть и точнее, но работает, правда, помедленнее. Сама же функция metaphone - весьма шустрая, предназначена, к сожалению, только для латиницы, так что, без транслита все же не обойтись :(
С релизом шестерки, проблемы с латинецей и metaphone исчезнут слава богу )
Отличное решение сложной проблемы!
спасибо большое за интересную и простую подачу такого, казалось бы, туманного алгоритма.
кто набрался смелости посчитать циферки для чака норриса — отпишитесь. страшно запускать.
Отлично написано, и все понятно. Автору плюсеги и спасибо :)
Попробую поставить к себе в поиск на аукцион фолбэкомм. У меня около 20% запросов с ошибками и еще 10% необходимо транслитирировать.
респектище! вот только возник вопрос, а что с умляутами? там в таблице только пару букв с закорючками. я так понимаю, должна быть где-то табличка замены всех этих буковок с точками/черточками на стандартную латиницу?
С нокией незадача.

нокия: 654000
nokia: 650000

Может надо еще эти ия иа учитывать?
Да, есть некоторые исключения, но это легко подогнать под задачу - чуть усовершенствовать функцию транслитерации, чтобы двойной звук "й" после гласной не кодировать - из звучащего в транслите nokija/нокийа должно получится nokia/нокиа. Оставляю тюнинг на усмотрение тех, кто захочет попробовать этот поиск. )
Меня больше удивило:
Bill: 780000
Paul: 780000
Тут я даже не знаю в какую сторону тюнить:)
Для Perl есть готовый модуль Text::Phonetic::DaitchMokotoff
Так вот там, результат не код, а массив кодов (потому что "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) ее фонетический родственник:)
Очень нравятся статьи написаны в доходчивой форме как эта )
Спасиба!
Спасибо большое за ликбез!
преподнесено в меру вульгарно и весьма доходчиво, читалось легко. Спасибо )
UFO just landed and posted this here
вряд ли он поможет при этом...
посмотри в сторону phpmorphy
По правилам такие слова кодируются, как если бы они были без пробела, но потребуется внести дополнительные изменения, чтобы получить ожидаемый результат для Вашего конкретного случая использования.
Блин =)
Привинтил к поиску на сайте. Решил поискать.
Набрал, естественно, слово «хуй». Вылетел эксэпшон.
Методом научного тыка установил, что функция работает, если строка содержит пять или больше символов.
Сейчас попробую разобраться, почему так.
От четырех символов, если быть точным. Большинство слов до 4 символов не нуждаются в поддержке со стороны такого поиска, потому что либо достаточно коротки, чтобы быть написанными без опечаток, либо попадают в разряд "stopwords" (артикли, предлоги, местоимения и всякие другие короткие слова). В принципе, все это можно тюнинговать, там в коде эти ограничения видны. Ваше, в частности, надо поменять в preg_replace
а я уже сам догадался
к тому же все короткие слова очень похожи ) поэтому ищешь «хуй», а находишь «мел»
Ну это грубо говоря.
А вообще ещё раз спасибо. Весь день сижу и играюсь: ищу всякое )
Неприлично же) Хоть бы звёздочку поставили =)
Это прям нереально крутая штуковина, господа!
Будем думать и внедрять)
Вы меня, конечно, извините. Но я не понял как вы осуществили поиск? Не добавили же дополнительные поля в DB, где весь текст был в кодах, и по нему осуществлялся бы поиск.
ну, если это поиск по базе людей, то не проблема к колонкам имя и фамилия добавить еще 2 с кодами
UFO just landed and posted this here
Очень интересно, только исходник функций пропал куда-то.
Сэр, благодарю за интересный пост!
Спасибо!
Интересненькое дело!
Будет необходимость - поиграюсь!
Пока что, просто на заметку!
Спасибо! )
А у меня опять всё не слава богу. Одни нули теперь показывает.
Верните старый код :) Этот не работает. А то я с работы скачал - всё пахало, уже на апач грешить стал. Ан нет.
Вернул, плохо скопипастил, пардон.
заказ==секс
световой==свадьба
хостинг==гостиница
музыка==месяц
видео==фото :))
Никогда бы не догадался, респект :) Но, судя по комментом, много косяков? :) Интересно, как на Yandex и др. сервисах пашет фича "Возможно вы имели ввиду".
Насчет косяков - я там выше написал, что это фолбэк-онли. И применяется в основном к именам собственным.
Sign up to leave a comment.

Articles