Поругайте алгоритм поиска по сайту. Есть сайт с тысячей всяких новостей, фотографий и записей, есть на сайте не релевантный поиск написанный с помощью запроса LIKE. В последнее время поиск начал тормозить и выдавать не то что нужно посетителям. Решил его переписать и сделать релевантным таким образом: 1)Создать в БД табличку (id-идентификатор обьекта,key-корень слова,type-тип объекта) 2)Написать функцию которая будет принимать id и тип объекта, доставать из базы текст новостей или статей, в зависмости от type объекта, текст очищать от всяких спец. символов, разбивать его на слова больше 2 символов и корни слов записывать в табличку описанную выше, вместе с идентификатором и типом объекта. 3)Эту функцию добавить везде, где есть добавления контента. Посетители будут вводить слова и фразы , после чего из этих слов будут извлечены корни и найдены результаты с учётом релевантности :lol: Только вот табличка с корнями получается тоже очень большой и будет так быстр по ней поиск как хотелось бы или нет? Ещё одно "но" , нет полнотекстового режима в MySQL.
флоппик Ну даже если бы и был полнотекстовый режим , всё равно индексировать придёться, что бы ускорить процес поиска
Если будет работать быстро и правильно, значит правильный, ты просто попробуй сперва реализовать, а потом и сам увидишь, что чтото не так
GvOzD Э-э-э... и как потом по этой табличке отображать результаты поиска? Пользователю надо: ссылка на страницу и фрагмент из странички, с подсветкой найденных слов желательно. Я не понял даже того, как из пары "id-type" регенерировать ссылку на страницу. Вообще, делать руками (не средствами MySQL) свой индекс - неблагодарное занятие. Потом даже создание SQL-дампа превратится в пытку, ибо будут десятки тысяч однообразных "крошечных" записей в таблице, которые будут жрать кучу места. А ведь такую таблицу тоже надо индексировать. Получается какой-то индекс для индекса... нерационально.
GvOzD Не только "добавления", но еще "редактирования" и "удаления". Если ты будешь удалять с сайта статью, не удаляя соответствующую ей часть индекса, у твоей системы поиска начнутся чудеса воображения а операция редактирования - это по сути удаление старой версии и добавление новой, т.е. индекс тоже надо подчищать и обновлять.
Вот я примерно по такому пути шел, ничего что бы мне понравилось, еще не получилось и все же я не теряю надежды, что версия велоспеда 3.0 будет без квадратных колес и останется только поставить седло, выровнять руль накачать шины и подтянуть цепь... И все же меня гложет сомнение, что если бы я сделал это на Sphinx то давным дано бы уже все работало как надо и я бы не парился. P.S. После долгих размышлений пришел к выводу, что поиск на большом большом сайте может быть хорошим исключительно сишный
Это понятно , что придёться при любом изменении вызывать функцию. А как средствами MySQL сделать индекс? Вот и мне лучше, ничего в голову не приходит
GvOzD Я сделал проще - табличка с полями address и content, первое хранит адрес страницы сайта (напр, "/" или "/articles/15"), второе - содержимое странички, почищенное от HTML-тегов и прочего мусора, т.е. чистый текст со страницы. На второе поле навесил FULLTEXT-индекс. Ищу слова по второму полю, благодаря индексу поиск очень быстрый, его же и использую для отображения результатов и подсветки слов. Главные минусы - поддержки морфологии нет, и слишком короткие слова не учитываются при поиске. Второе вроде как можно победить на MySQL 5, а вот первое...
Dagdamor А чистишь от тагов с помощью strip_tags или регулярочкой? А нельзя искать по корню слова с частичным соответствием раезве , при полнотекстовом поиске ? Типа как "%пут%рул%" при like'е ?
Вообще есть 2 способа внедрить морфологию -- либо использовать словари (того же Зализняка, -- только перерабатывать его нужно -- а это время...) -- либо, что используется чаще всего -- использовать реализацию стеммеров -- например, стеммер Портера - в инете есть несолько opensource реализаций. 2 метод не совсем верный, но быстрый и в 90% приемлимый.
Про морфологию я знаю, даже сам про это писал http://gv0zdik.livejournal.com/10301.html А в остальном вроде всё понятно, тема закрыта.