Оба выражения не эквивалентны:
полнотекстовая функция ищет слова, тогда как LIKE
со специальным символом %
в основном ищет любыечасть поля
другое отличие состоит в том, что полнотекстовый поиск допускает слова в любой последовательности, тогда как LIKE
запрашивает, чтобы слова следовали порядку, указанному в шаблоне
При использовании полнотекстового поиска MySQL намеренно игнорирует предопределенный список очень распространенных слов, называемых stopwords : как вы и предполагали, this
является одним из них.Это, вероятно, то, что мешает вашей ценности соответствовать.Вам нужно будет удалить это слово из поиска.См. эту ссылку для получения списка полнотекстовых стоп-слов MySQL (или просто запроса INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD
).
Рассмотрите следующий набор данных:
select * from mytable;
| id | name |
| --- | ----------------------- |
| 1 | this happened last week |
| 2 | last week this happened |
| 3 | thishappenedlastweek |
| 4 | this happens this week |
При фильтрации с использованием LIKE
:
select * from mytable where name like '%this%week%';
| id | name |
| --- | ----------------------- |
| 1 | this happened last week |
| 3 | thishappenedlastweek |
| 4 | this happens this week |
При полнотекстовом поиске и стоп-слове 'this'
ничего не возвращается:
select *
FROM mytable
WHERE MATCH (name) AGAINST ('+this +week' IN BOOLEAN MODE);
There are no results to be displayed.
Это будет работать при удалении стоп-слова:
select *
FROM mytable
WHERE MATCH (name) AGAINST ('+week' IN BOOLEAN MODE);
| id | name |
| --- | ----------------------- |
| 1 | this happened last week |
| 2 | last week this happened |
| 4 | this happens this week |
Комбинации, не включающие стоп-слова, также работают:
select *
FROM mytable
WHERE MATCH (name) AGAINST ('+happened +week' IN BOOLEAN MODE);
| id | name |
| --- | ----------------------- |
| 1 | this happened last week |
| 2 | last week this happened |
Демонстрация на DB Fiddle .