Выполнение полнотекстового поискового запроса Mysql

#mysql #search #full-text-search

#mysql #Поиск #полнотекстовый поиск

Вопрос:

Приветствую всех

Просто хотелось бы знать разницу в следующих запросах :

 select*, MATCH ( thread_title, first_post ) AGAINST ('apple' IN BOOLEAN MODE) as relevance from posts where MATCH(`thread_title`, `first_post`) AGAINST('apple'  IN BOOLEAN MODE)  ORDER BY relevance DESC
  

и

 select*, MATCH ( thread_title, first_post ) AGAINST ('apple' IN BOOLEAN MODE) as relevance from posts   ORDER BY relevance DESC 
  

Отредактировано

На самом деле оба получают правильные результаты в верхней части, второй получает намного больше результатов, а первый получает только правильные результаты. Выполнение второго занимает много времени, в конце концов, первый намного быстрее. Не знаю почему.

Ответ №1:

Первый запрос вернет результаты только для строк, которые соответствуют установленному вами ограничению (т.Е. те результаты, которые содержат apple либо в thread_title, либо в first_post), тогда как второй вернет все строки, независимо от того, содержат они совпадение с вашим поисковым запросом или нет.

Ответ №2:

Этот запрос:

 SELECT  *,
        MATCH (thread_title, first_post) AGAINST ('apple' IN BOOLEAN MODE) AS relevance
FROM    posts
ORDER BY
        relevance DESC
  

вернет все записи из вашей таблицы (с relevance = 0 для тех, которые не содержат 'apple' ).

Этот запрос:

 SELECT  *,
        MATCH (thread_title, first_post) AGAINST ('apple' IN BOOLEAN MODE) AS relevance
FROM    posts
WHERE   MATCH (thread_title, first_post) AGAINST ('apple' IN BOOLEAN MODE)
ORDER BY
        relevance DESC
  

вернет только записи, содержащие 'apple' либо в thread_title , либо first_post в. Все возвращаемые значения релевантности будут больше 0 .

Второй запрос выполняется быстрее, потому что у вас, скорее всего, есть FULLTEXT INDEX вкл posts (thread_title, first_post) , и совпадения ищутся с использованием этого индекса.