За последние 24 часа нас посетили 17949 программистов и 1614 роботов. Сейчас ищут 1453 программиста ...

Релевантный морфологический индексируемый поиск )

Тема в разделе "Решения, алгоритмы", создана пользователем GvOzD, 18 ноя 2008.

  1. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Поругайте алгоритм поиска по сайту. Есть сайт с тысячей всяких новостей, фотографий и записей, есть на сайте не релевантный поиск написанный с помощью запроса LIKE. В последнее время поиск начал тормозить и выдавать не то что нужно посетителям. Решил его переписать и сделать релевантным таким образом:

    1)Создать в БД табличку (id-идентификатор обьекта,key-корень слова,type-тип объекта)
    2)Написать функцию которая будет принимать id и тип объекта, доставать из базы текст новостей или статей, в зависмости от type объекта, текст очищать от всяких спец. символов, разбивать его на слова больше 2 символов и корни слов записывать в табличку описанную выше, вместе с идентификатором и типом объекта.
    3)Эту функцию добавить везде, где есть добавления контента.

    Посетители будут вводить слова и фразы , после чего из этих слов будут извлечены корни и найдены результаты с учётом релевантности :lol: Только вот табличка с корнями получается тоже очень большой и будет так быстр по ней поиск как хотелось бы или нет?
    Ещё одно "но" , нет полнотекстового режима в MySQL.
     
  2. MySQL 3.23 ?
     
  3. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    флоппик
    Ну даже если бы и был полнотекстовый режим , всё равно индексировать придёться, что бы ускорить процес поиска
     
  4. kostyl

    kostyl Guest

    GvOzD
    ну так индексируй
     
  5. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    kostyl
    Ну алгоритм правильный или нет , вот о чем я спрашиваю? Или есть какие-нибудь другие методы
     
  6. kostyl

    kostyl Guest

    Если будет работать быстро и правильно, значит правильный, ты просто попробуй сперва реализовать, а потом и сам увидишь, что чтото не так ;)
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    GvOzD
    Э-э-э... и как потом по этой табличке отображать результаты поиска? Пользователю надо: ссылка на страницу и фрагмент из странички, с подсветкой найденных слов желательно. Я не понял даже того, как из пары "id-type" регенерировать ссылку на страницу.

    Вообще, делать руками (не средствами MySQL) свой индекс - неблагодарное занятие. Потом даже создание SQL-дампа превратится в пытку, ибо будут десятки тысяч однообразных "крошечных" записей в таблице, которые будут жрать кучу места. А ведь такую таблицу тоже надо индексировать. Получается какой-то индекс для индекса... нерационально.
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    GvOzD
    Не только "добавления", но еще "редактирования" и "удаления". Если ты будешь удалять с сайта статью, не удаляя соответствующую ей часть индекса, у твоей системы поиска начнутся чудеса воображения ;) а операция редактирования - это по сути удаление старой версии и добавление новой, т.е. индекс тоже надо подчищать и обновлять.
     
  9. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Dagdamor
    Спасибо за разъяснение, а подскажи пожалуйста как сделать правильно ?
     
  10. dAllonE

    dAllonE Guest

    Вот я примерно по такому пути шел, ничего что бы мне понравилось, еще не получилось и все же я не теряю надежды, что версия велоспеда 3.0 будет без квадратных колес и останется только поставить седло, выровнять руль накачать шины и подтянуть цепь...
    И все же меня гложет сомнение, что если бы я сделал это на Sphinx то давным дано бы уже все работало как надо и я бы не парился.

    P.S. После долгих размышлений пришел к выводу, что поиск на большом большом сайте может быть хорошим исключительно сишный
     
  11. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Это понятно , что придёться при любом изменении вызывать функцию.

    А как средствами MySQL сделать индекс?

    Вот и мне лучше, ничего в голову не приходит
     
  12. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    GvOzD
    Я сделал проще - табличка с полями address и content, первое хранит адрес страницы сайта (напр, "/" или "/articles/15"), второе - содержимое странички, почищенное от HTML-тегов и прочего мусора, т.е. чистый текст со страницы. На второе поле навесил FULLTEXT-индекс. Ищу слова по второму полю, благодаря индексу поиск очень быстрый, его же и использую для отображения результатов и подсветки слов. Главные минусы - поддержки морфологии нет, и слишком короткие слова не учитываются при поиске. Второе вроде как можно победить на MySQL 5, а вот первое...
     
  13. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Dagdamor
    А чистишь от тагов с помощью strip_tags или регулярочкой?

    А нельзя искать по корню слова с частичным соответствием раезве , при полнотекстовом поиске ? Типа как "%пут%рул%" при like'е ?
     
  14. gzim9x

    gzim9x Активный пользователь

    С нами с:
    15 авг 2008
    Сообщения:
    2
    Симпатии:
    0
    Вообще есть 2 способа внедрить морфологию -- либо использовать словари (того же Зализняка, -- только перерабатывать его нужно -- а это время...) -- либо, что используется чаще всего -- использовать реализацию стеммеров -- например, стеммер Портера - в инете есть несолько opensource реализаций. 2 метод не совсем верный, но быстрый и в 90% приемлимый.
     
  15. GvOzD

    GvOzD Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Про морфологию я знаю, даже сам про это писал
    http://gv0zdik.livejournal.com/10301.html

    А в остальном вроде всё понятно, тема закрыта.