Полнотекстовый поиск MySQL «+ эта + неделя» не работает должным образом - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь использовать полнотекстовый поиск в своей базе данных для ускорения результатов, но, похоже, он не работает должным образом:

Например, следующий запрос не возвращает результата

select * FROM data WHERE MATCH (name) AGAINST ('+this +week' IN BOOLEAN MODE)

Когда этот возвращает результаты:

select * FROM data WHERE name like '%this%week%'

Что я делаю не так?

Редактировать: во многих строках имя начинается с 'this week'.

1 Ответ

0 голосов
/ 03 марта 2019

Оба выражения не эквивалентны:

  • полнотекстовая функция ищет слова, тогда как 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...