Включение и исключение слов из FULLTEXT - поиска

Задача
Вы хотите специально указать слова, которые должны присутствовать или быть исключены из FULLTEXT поиска.

Решение
Используйте FULLTEXT поиск в логическом (Boolean) режиме.

Обсуждение
Обычно FULLTEXTпоиск возвращает записи, содержащие любое из слов строки поиска, даже если некоторые другие отсутствуют. Например, следующий запрос находит записи, которые содержат хотя бы одно из имен David или Goliath:

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('David Goliath');

+------------ +
| COUNT(*) |
+------------ +
| 934 |
+ ------------+

Но что делать, если вам нужны только записи, содержащие оба слова? Можно переписать запрос так, чтобы искать слова по отдельности, и соединить результаты при помощи оператора AND:

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('David')
> AND MATCH(vtext) AGAINST('Goliath');

+ ------------+
| COUNT(*) |
+------------ +
| 2 |
+------------ +

Начиная с версии MySQL 4.0.1 есть еще одна возможность потребовать присутствия в выводе нескольких слов – поиск в логическом режиме.


Для того чтобы показать, что слово строки поиска должно содержаться в каждой возвращенной строке, поставьте перед ним символ + и завершите строку словами IN BOOLEAN MODE:

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('+David +Goliath' IN BOOLEAN MODE)

+ ------------ +
| COUNT(*) |
+ ------------+
| 2 |
+------------ +

Поиск в логическом режиме также позволяет исключать слова. Просто поставьте перед каждым нежелательным словом символ . Следующие запросы выбирают записи таблицы kjv, содержащие имя David, но не содержащие имя Goliath, или наоборот:

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('+David - Goliath' IN BOOLEAN MODE)

+------------ +
| COUNT(*) |
+ ------------+
| 928 |
+ ------------+

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('David +Goliath' IN BOOLEAN MODE)

+ ------------+
| COUNT(*) |
+ ------------ +
| 4 |
+ ------------+

Еще одним специальным символом логического режима поиска является *, добавляемый в конец слова и действующий как групповой символ.


Следующий запрос находит записи, которые содержат не только whirl, но и такие слова, как whirls, whirleth и whirlwind:

mysql> SELECT COUNT(*) FROM kjv
> WHERE MATCH(vtext) AGAINST('whirl*' IN BOOLEAN MODE);

+------------ +
| COUNT(*) |
+ ------------+
| 28 |
+ ------------+


Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
FULLTEXT поиск и короткие слова
Буквальная интерпретация метасимволов в шаблонах
Поиск по образцу с помощью регулярных выражений
Поиск по образцу с помощью шаблонов SQL
Поиск с помощью индекса FULLTEXT

Вернуться в раздел: MySQL / 4. Работа со строками