MySQL использует общий индекс для столбцов таблицы, чтобы ускорить поиск, и этот тип поиска называется индексом BTREE. Другим типом индекса является индекс FULLTEXT, который отличается от индекса BTREE. Полнотекстовый индекс используется для поиска определенного ключевого слова в тексте, а не определенного значения в проиндексированных столбцах. Индекс BTREE и индекс FULLTEXT могут применяться к одному и тому же столбцу таблицы.
Возможности индекса FULLTEXT
- Его можно применять к полям CHAR, VARCHAR и таблицы TEXT.
- Он поддерживает механизмы хранения InnoDB и MyISAM.
- Используется только с предложениями MATCH() и AGAINST().
Типы режимов полнотекстового поиска
С помощью индекса FULLTEXT можно выполнять три типа поиска, которые поясняются ниже:
1. Логический режим
Этот тип поиска используется для запросов, содержащих логические операторы, такие как оператор меньше (‘<‘) и больше чем (‘>’), знак плюс (‘+’), знак минус (‘- ‘), двойные кавычки (“”), подстановочный знак (‘*) и т. д.
2. Режим естественного языка
Тип поиска по умолчанию интерпретирует строку поиска как литеральную фазу.
3. Режим расширения запроса
В этом типе поиска поиск выполняется два раза. Второй поиск применяется к результату первого поиска, чтобы найти наиболее релевантные результаты поиска.
Предпосылки
Создайте таблицу с данными в базе данных MySQL, чтобы проверить использование полнотекстового поиска в MySQL. Откройте терминал и подключитесь к серверу MySQL, выполнив следующую команду:
$ sudo mysql -u root
Выполните следующую команду, чтобы создать базу данных с именем test_db :
CREATE DATABASE test_db;
Выполните следующую команду, чтобы выбрать базу данных:
USE test_db;
Выполните следующий запрос, чтобы создать таблицу с именем customers и пятью полями:
CREATE TABLE customers( id INT NOT NULL PRIMARY KEY, name VARCHAR(30) NOT NULL, email VARCHAR(50), address TEXT, contact_no VARCHAR(15));
Выполните следующий запрос INSERT, чтобы вставить четыре записи в таблицу клиентов .
INSERT INTO `customers` (`id`, `name`, `email`, `address`, `contact_no`) VALUES ('4001', 'AndreyEx Terminator', 'AndreyEx@gmail.com', 'Krasnay, Krasnodar', '00000'), ('4002', 'Anna Pupkina', 'AnnaPup@gmail.com', 'Krasnay, Moscow', '11111'), ('4003', 'Maxs Terminator', 'Maxs@gmail.com', 'Lenina, Piter', '22222'),
Выполните следующую команду, чтобы добавить индекс FULLTEXT для поля адреса таблицы клиентов.
Alter table customers ADD FULLTEXT (address);
Выполните следующую команду, чтобы проверить список определенных индексов таблицы клиентов :
SHOW INDEX FROM customers;
Следующие выходные данные показывают, что для таблицы клиентов существует два индекса. Один из них — это индекс BTREE, который был определен по умолчанию для основного поля, а другой — индекс FULLTEXT, который был определен позже для поля адреса.
Использование полнотекстового поиска
В этом руководстве показан поиск в таблице с использованием различных режимов FULLTEXT-индекса.
ПОЛНОТЕКСТОВЫЙ поиск в логическом режиме
Следующий запрос SELECT будет искать слово «Moscow» в поле адреса таблицы клиентов в логическом режиме. Таблица клиентов содержит только одну запись, соответствующую этому критерию:
SELECT * FROM customers WHERE MATCH(address) AGAINST('Moscow' IN BOOLEAN MODE);
После выполнения предыдущего запроса появится следующий вывод.
Выполните следующий запрос SELECT для поиска обоих слов, “Moscow” и “Krasnay” в поле адреса таблицы клиентов с использованием индекса FULLTEXT в логическом режиме. В таблице клиентов есть две строки, содержащие оба слова: «Moscow» и «Krasnay» :
SELECT * FROM customers WHERE MATCH(address) AGAINST('Moscow + Krasnay' IN BOOLEAN MODE);
После выполнения предыдущего запроса появится следующий вывод. Вывод показывает, что поле адреса содержит «Moscow» и «Krasnay».
Выполните следующий запрос SELECT для поиска тех строк таблицы клиентов, которые содержат слово “Moscow”, но не содержат слова “Krasnay” в поле адреса таблицы клиентов , используя полнотекстовый индекс в логическом режиме. В таблице клиентов существуют две строки , соответствующие критериям:
SELECT * FROM customers WHERE MATCH(address) AGAINST('Moscow -Krasnay' IN BOOLEAN MODE);
После выполнения предыдущего запроса появится следующий вывод. Вывод показывает, что поле адреса содержит «Moscow», но не «Krasnay».
ПОЛНОТЕКСТОВЫЙ поиск в режиме естественного языка
Выполните следующую команду, чтобы добавить индекс FULLTEXT для поля имени таблицы клиентов :
Alter table customers ADD FULLTEXT (name);
Следующий запрос SELECT будет искать слово «Terminator» в поле имени таблицы клиентов в режиме естественного языка. Таблица клиентов содержит две записи, соответствующие этому критерию:
SELECT * FROM customers WHERE MATCH(name) AGAINST('Terminator' IN NATURAL LANGUAGE MODE);
После выполнения предыдущего запроса появится следующий вывод. Строки, содержащие значение ‘Terminator’ в поле имени, были показаны в выходных данных.
ПОЛНОТЕКСТОВЫЙ поиск в режиме расширения запроса
Следующий запрос SELECT будет искать слово «AndreyEx» в поле имени таблицы клиентов в режиме расширения запроса. Таблица клиентов содержит две записи, соответствующие этому критерию:
SELECT * FROM customers WHERE MATCH(name) AGAINST("AndreyEx" WITH QUERY EXPANSION);
После выполнения предыдущего запроса появится следующий вывод. В выходных данных поле имени первой строки содержит слово «AndreyEx» с другим словом «Terminator», а поле имени второй строки содержит соответствующее слово «Terminator».
Удалить индекс FULLTEXT
Выполните следующую команду, чтобы удалить FULLTEXT индекс поля имени:
ALTER TABLE customers DROP INDEX name;
Выполните следующую команду, чтобы проверить текущий список индексов таблицы клиентов после удаления индекса FULLTEXT из поля имени:
SHOW INDEX FROM customers;
После выполнения предыдущего запроса появится следующий вывод. Вывод показывает, что таблица клиентов содержит один индекс BTREE для поля id и один FULLTEXT для поля адреса.
Вывод
Различные способы поиска содержимого в таблице с использованием индекса FULLTEXT были показаны в этом руководстве, чтобы помочь новым пользователям MySQL изучить использование поиска FULLTEXT в MySQL. Кроме того, обсуждались полные возможности индекса FULLTEXT. Мы надеемся, что вы нашли эту статью полезной.