Fulltext поиск

vipTelnet

Постоялец
Регистрация
14 Янв 2013
Сообщения
143
Реакции
11
Всем привет.
Есть задача сделать поиск по сайту.
Решил делать через индексы fulltext в таблице
все хорошо все понятно, если б не одно но
как написано тут
Для просмотра ссылки Войди или Зарегистрируйся
Поиск по слову ``MySQL'' в предыдущем примере не приводит к каким-либо результатам, так как это слово присутствует более чем в половине строк. По существу, данное слово целесообразно трактовать как стоп-слово (т.е. слово с нулевой смысловой ценностью). Это наиболее приемлемое решение - запрос на естественном языке не должен возвращать каждую вторую строку из таблицы размером 1Гб.

Это можно устранить как я понял добавив в запрос аттрибут IN BOOLEAN MODE
  1. SELECT * FROM articles
  2. WHERE MATCH (title,body) AGAINST ('MySQL' IN BOOLEAN MODE);

но тогда пропадает релевантость поиска,
т.е результаты не возможно будет отсортировать по количеству вхождений поисковой фразы в поля по которым произоводится поиск.

Я если честно не могу вообще понять почему без IN BOOLEAN MODE он просто по слову MySQL ни чего не возвращает.
И возможно как то сделать так что он искал и выдавал результат и для тех слов которые будут встречаться более чем в половине статей на сайте и одновременно сохранить релевантоность.

Просто получается что тогда либо есть возможность использование релевантности, но простые одно словные запросы которые будут содержаться более чем в половине строк , будут возвращать 0 записей
Или же с использованием IN BOOLEAN MODE мы будем получать все результаты но без возможности сделать сортировку по релевантности.
 
Полнотекстовый поиск в MySQL очень неудобен и плох, КМК. Он больше мешает, чем помогает.
Если есть желание сделать именно качественный полнотекстовый поиск - лучше смотреть в сторону Для просмотра ссылки Войди или Зарегистрируйся
Если контента на сайте не много - я использую обычные LIKE %% без индексов.
 
Если количество записей большое и строка для поиска не длинная, то может помочь такой хак: создаём столько полей сколько в среднем букв в слове и при записи разносим в каждую колонку строку со сдвигом в один символ вперёд. Для всех колонок создаём индексы и пo like <xxx>% поиск будет проходить мгновенно с учётом индексов.
 
В задаче поиска по сайту, проще реализовать подключив google стандартную форму поиска или его api Custom Google Search (в этом случае не будет никаких логотипов Google и рекламы). Один минус, сто беслпатных запросов в день, это решается генерацией нового ключа. Оба варианта просты и понятны, все описано в доках.

Можно реализовать монстроподобное решение, на примере Java, которое дает очень хорошие результаты, но требует титанических усилии. Связка Solr(различные анализоторы, со стеммингоом) в качестве индекса и паучка для индексации страниц Nutch. В этом случае Nutch скармливает данные Solr, а поиск ведется по Solr.
 
Последнее редактирование модератором:
Назад
Сверху