#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)
, и совпадения ищутся с использованием этого индекса.