Fulltext поиск

Тема в разделе "Базы данных", создана пользователем vipTelnet, 11 май 2014.

Модераторы: latteo
  1. vipTelnet

    vipTelnet Постоялец

    Регистр.:
    14 янв 2013
    Сообщения:
    134
    Симпатии:
    11
    Всем привет.
    Есть задача сделать поиск по сайту.
    Решил делать через индексы fulltext в таблице
    все хорошо все понятно, если б не одно но
    как написано тут
    http://www.mysql.ru/docs/man/Fulltext_Search.html
    Поиск по слову ``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 мы будем получать все результаты но без возможности сделать сортировку по релевантности.
     
  2. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    Полнотекстовый поиск в MySQL очень неудобен и плох, КМК. Он больше мешает, чем помогает.
    Если есть желание сделать именно качественный полнотекстовый поиск - лучше смотреть в сторону http://sphinxsearch.com/
    Если контента на сайте не много - я использую обычные LIKE %% без индексов.
     
  3. enotanet

    enotanet Писатель

    Регистр.:
    3 июн 2014
    Сообщения:
    5
    Симпатии:
    1
    Если количество записей большое и строка для поиска не длинная, то может помочь такой хак: создаём столько полей сколько в среднем букв в слове и при записи разносим в каждую колонку строку со сдвигом в один символ вперёд. Для всех колонок создаём индексы и пo like <xxx>% поиск будет проходить мгновенно с учётом индексов.
     
  4. fdgfdgfh

    fdgfdgfh Создатель

    Регистр.:
    30 май 2014
    Сообщения:
    27
    Симпатии:
    5
    В задаче поиска по сайту, проще реализовать подключив google стандартную форму поиска или его api Custom Google Search (в этом случае не будет никаких логотипов Google и рекламы). Один минус, сто беслпатных запросов в день, это решается генерацией нового ключа. Оба варианта просты и понятны, все описано в доках.

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