Полнотекстовый поиск с помощью Fulltext

Тема в разделе "Базы данных", создана пользователем Denixxx, 2 апр 2015.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Кто как решал проблему поиска на своём сайте с учетом русской морфологии?
    Я сделал 2 варианта:
    1. Полнотекстовый поиск
    Код:
    SELECT `id` FROM `items` WHERE MATCH(`name`,`short`,`full`) AGAINST('".$searchquery."')
    Недостатки:
    — менее 4 букв в слове не ищет;
    — русская морфология почти никакая: «жесткий диск»не найдёт если задано «жесткие диски»
    — сортировка вывода неадекватная;
    — работает только на MyISAM
    Достоинства:
    — просто и хоть что-то находит по неточному соответствию.
    2. Через LIKE — чтобы найти хоть что-то в слове из 3 букв.
    Код:
    SELECT `id` FROM `items` WHERE (`name` LIKE '%".$searchquery."%' OR `short` LIKE '%".$searchquery."%' OR `full` LIKE '%".$searchquery."%');
    Недостатки:
    — морфологии никакой, только точное соответствие;
    — при большом количестве записей тормозит;
    — нет релевантности
    Достоинства
    — ищет и по 2-м и по 3-м буквам

    Чего мне не надо: разные расширения типа Сфинкс и пр.
    Потому что поиск в составе движка и может применяться на разных хостингах и в разных условиях.
    Как эту задачу решали Вы? Поделитесь, буду благодарен.
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    144
    Симпатии:
    107
    Необходимо создавать поисковый индекс с применением php библиотеки http://phpmorphy.sourceforge.net/dokuwiki/
    Эта штука есть в пакете mSearch2 для MODx, как пример поиска, на сайте самого разработчика modx.pro - там заодно дополнительную инфу найдешь.
     
    Denixxx нравится это.
  3. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Читал-читал, и так и не понял — как этим пользоваться? Неужели нет каких-то решений попроще?
     
  4. krivov

    krivov Постоялец

    Регистр.:
    24 дек 2007
    Сообщения:
    142
    Симпатии:
    19
    Мы обычно используем LIKE если не нужна морфология и Sphinx если нужна.

    Есть ещё некий модификатор IN BOOLEAN MODE - для поиска части строки, а не строгого соответствия
    SELECT `id` FROM `items` WHERE MATCH(`name`,`short`,`full`) AGAINST(*'".$searchquery."'* IN BOOLEAN MODE)
    и можно так делать - AGAINST('*слово1**слово2*' IN BOOLEAN MODE)
     
  5. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Это всё понятно, но не работает на русском языке как надо.
    Для нормальной работы приходится вырезать теги, приставки, суффиксы и окончания, что я и сделал.
    Вот формирование запроса MySQL с помощью стеммера Портера:
     
    Последнее редактирование: 26 июн 2015
  6. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Вы сделали какой-то адский ад. Вам же сказали, если нужна морфология - Sphinx. Зачем эти извращения с животными? Вы sphinx никогда не повторите и будете еще долго ловить косяки с таким поиском.
     
    latteo нравится это.
  7. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Я очень рад, что Вам попадаются заказчики сплошь с VDS, куда можно установить что угодно — хошь постгрес, хошь сфинкс, хошь гит.
    Однако в повседневной жизни чаще встречается виртуальный хостинг, где до всего этого далеко.
    Вы попробуйте техническим условием к движку сделать обязательным наличием сфинкс и я посмотрю — сколько версий движка удастся продать.

    Вообще к чему эта сентенция «Вам же сказали, что лучше Сфинкса животного нет»?
    Ещё в первом посте я указал что нужно сделать — и какие решения меня не устраивают.
    Нравится это или нет, но у программиста есть ТЗ, заказчик платит деньги — и нужно работать в рамках условий.
    Как бы кому-то не нравились решения с египетскими названиями — заказчик сказал «нет», значит нет.
     
    latteo нравится это.
  8. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
Статус темы:
Закрыта.