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; две реализации совершенно разные.

Другие вопросы по тегам