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

Статус
В этой теме нельзя размещать новые ответы.

Denixxx

Мой дом здесь!
Регистрация
7 Фев 2014
Сообщения
244
Реакции
216
Кто как решал проблему поиска на своём сайте с учетом русской морфологии?
Я сделал 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-м буквам

Чего мне не надо: разные расширения типа Сфинкс и пр.
Потому что поиск в составе движка и может применяться на разных хостингах и в разных условиях.
Как эту задачу решали Вы? Поделитесь, буду благодарен.
 
Необходимо создавать поисковый индекс с применением php библиотеки Для просмотра ссылки Войди или Зарегистрируйся
Эта штука есть в пакете mSearch2 для MODx, как пример поиска, на сайте самого разработчика modx.pro - там заодно дополнительную инфу найдешь.
 
Необходимо создавать поисковый индекс с применением php библиотеки Для просмотра ссылки Войди или Зарегистрируйся
Эта штука есть в пакете mSearch2 для MODx, как пример поиска, на сайте самого разработчика modx.pro - там заодно дополнительную инфу найдешь.
Читал-читал, и так и не понял — как этим пользоваться? Неужели нет каких-то решений попроще?
 
Мы обычно используем 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)
 
Есть ещё некий модификатор IN BOOLEAN MODE - для поиска части строки, а не строгого соответствия
SELECT `id` FROM `items` WHERE MATCH(`name`,`short`,`full`) AGAINST(*'".$searchquery."'* IN BOOLEAN MODE)
и можно так делать - AGAINST('*слово1**слово2*' IN BOOLEAN MODE)
Это всё понятно, но не работает на русском языке как надо.
Для нормальной работы приходится вырезать теги, приставки, суффиксы и окончания, что я и сделал.
Вот формирование запроса MySQL с помощью стеммера Портера:
 
Последнее редактирование:
Это всё понятно, но не работает на русском языке как надо.
Для нормальной работы приходится вырезать теги, приставки, суффиксы и окончания, что я и сделал.
Вот формирование запроса MySQL с помощью стеммера Портера:
Вы сделали какой-то адский ад. Вам же сказали, если нужна морфология - Sphinx. Зачем эти извращения с животными? Вы sphinx никогда не повторите и будете еще долго ловить косяки с таким поиском.
 
Вы сделали какой-то адский ад. Вам же сказали, если нужна морфология - Sphinx. Зачем эти извращения с животными? Вы sphinx никогда не повторите и будете еще долго ловить косяки с таким поиском.
Я очень рад, что Вам попадаются заказчики сплошь с VDS, куда можно установить что угодно — хошь постгрес, хошь сфинкс, хошь гит.
Однако в повседневной жизни чаще встречается виртуальный хостинг, где до всего этого далеко.
Вы попробуйте техническим условием к движку сделать обязательным наличием сфинкс и я посмотрю — сколько версий движка удастся продать.

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