Mariadb полнотекстового соответствия двух столбцов
У меня проблема с синтаксисом моего запроса:
SELECT `users`.`name`, `posts`.*
FROM `posts`
LEFT JOIN `users` ON `posts`.`user_id` = `users`.`id`
WHERE MATCH (title,body) AGAINST('search')
MATCH
работает только с одним, а не с обоими... пожалуйста, посоветуйте мне, как это исправить...
1 ответ
Проверить на "search"
будучи в обоих title
а также body
Рекомендую эту неочевидную комбинацию. (Я опускаю users
как не относящиеся к вопросу.)
SELECT p1.*
FROM posts AS p1
WHERE MATCH(p1.title) AGAINST("search" IN BOOLEAN MODE)
AND EXISTS (
SELECT *
FROM posts AS p2
WHERE MATCH(p2.body) AGAINST("search" IN BOOLEAN MODE)
)
Когда используешь FULLTEXT
Я не думаю, что оптимизатор знает, как эффективно применять FULLTEXT дважды, так что это хитрый способ заставить его это сделать.
я выбрал title
сначала исходя из предположения, что в нем меньше слов, следовательно, меньше нужно переходить к другому тесту.
Может случиться так, что "пересечение слияния индекса" сработает для этого:
SELECT *
FROM posts
WHERE MATCH(title) AGAINST("search" IN BOOLEAN MODE)
AND MATCH(body) AGAINST("search" IN BOOLEAN MODE)
В обоих случаях вам нужны оба:
FULLTEXT(title),
FULLTEXT(body)
Отдельный индекс ft с обоими столбцами бесполезен.
Пожалуйста предоставьте SHOW CREATE TABLE
а также EXPLAIN SELECT ...
если вам нужно обсудить дальше.
Возможно, имеет значение, есть ли у вас ENGINE=MyISAM
или же ENGINE=InnoDB
; две реализации совершенно разные.