14.9.8 ngram Полный поиск по тексту
Встроенный синтаксический анализатор MySQL для полнотекстового поиска использует пробелы между словами в качестве разделителей для определения начала и конца слов, что является ограничением при работе с иероглифическими языками, не использующими разделителей слов. Чтобы преодолеть это ограничение, MySQL предоставляет синтаксический анализатор ngram, который поддерживает китайский, японский и корейский языки (CJK). Синтаксический анализатор ngram поддерживается для использования с InnoDB и MyISAM.
MySQL также предоставляет плагин синтаксического анализатора MeCab для японского языка, который разбивает документы на осмысленные слова. Дополнительную информацию см. в разделе 14.9.9 «Плагин синтаксического анализатора MeCab».
Ngram — это непрерывная последовательность n символов из заданной последовательности текста. Парсер ngram разбивает последовательность текста на непрерывную последовательность n символов. Например, вы можете разбить “abcd” на различные значения n с помощью синтаксического анализатора ngram.
n=1: 'a', 'b', 'c', 'd'
n=2: 'ab', 'bc', 'cd'
n=3: 'abc', 'bcd'
n=4: 'abcd'Синтаксический анализатор ngram является встроенным серверным плагином. Как и другие встроенные серверные плагины, он автоматически загружается при запуске сервера.
Синтаксис полнотекстового поиска, описанный в разделе 14.9 «Функции полнотекстового поиска», применяется к плагину синтаксического анализатора ngram. Различия в поведении анализа описаны в этом разделе. Параметры конфигурации, связанные с полным текстом, за исключением параметров минимальной и максимальной длины слов (innodb_ft_min_token_size, innodb_ft_max_token_size, ft_min_word_len, ft_max_word_len) также применимы.
Настройка размера токена ngram
Парсер ngram имеет значение по умолчанию для размера токена ngram — 2 (биграммы). Например, с размером токена 2 парсер ngram анализирует строку “abc def” на четыре токена: “ab”, “bc”, “de” и “ef”.
Размер токена ngram можно настроить, используя параметр конфигурации ngram_token_size, который имеет минимальное значение 1 и максимальное значение 10.
Обычно ngram_token_size устанавливается в размер наибольшего токена, который требуется искать. Если предполагается искать только отдельные символы, установите ngram_token_size в 1. Более маленький размер токена приводит к меньшему индексу полнотекстового поиска и более быстрым поискам. Если необходимо искать слова, состоящие более чем из одного символа, установите ngram_token_size соответствующим образом. Например, “Happy Birthday” в упрощенном китайском языке — “生日快乐”, где “生日” — это “день рождения”, а “快乐” переводится как “счастье”. Чтобы искать слова из двух символов, такие как эти, установите ngram_token_size на значение 2 или выше.
Как переменная только для чтения, ngram_token_size может быть установлена только как часть строки запуска или в файле конфигурации:
-
Строка запуска:
mysqld --ngram_token_size=2
-
Файл конфигурации:
[mysqld] ngram_token_size=2
Следующие параметры конфигурации минимальной и максимальной длины слов игнорируются для индексов FULLTEXT, использующих синтаксический анализатор ngram: innodb_ft_min_token_size, innodb_ft_max_token_size, ft_min_word_len и ft_max_word_len.
Создание индекса FULLTEXT, использующего синтаксический анализатор ngram
Для создания индекса FULLTEXT, использующего синтаксический анализатор ngram, укажите WITH PARSER ngram с CREATE TABLE, ALTER TABLE или CREATE INDEX.
Следующий пример демонстрирует создание таблицы с индексом ngram FULLTEXT, вставку тестовых данных (текст упрощенного китайского языка) и просмотр токенизированных данных в таблице схемы информации INNODB_FT_INDEX_CACHE.
mysql> USE test;
mysql> CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;
mysql> SET NAMES utf8mb4;
INSERT INTO articles (title,body) VALUES
('数据库管理','在本教程中我将向你展示如何管理数据库'),
('数据库应用开发','学习开发数据库应用程序');
mysql> SET GLOBAL innodb_ft_aux_table="test/articles";
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position; Чтобы добавить индекс FULLTEXT в существующую таблицу, можно использовать ALTER TABLE или CREATE INDEX. Например:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT
) ENGINE=InnoDB CHARACTER SET utf8mb4;
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;
# Or:
CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
Обработка пробелов парсером ngram
Парсер ngram удаляет пробелы при анализе. Например:
“ab cd” анализируется как “ab”, “cd”
“a bc” анализируется как “bc”
Обработка стоп-слов парсером ngram
Встроенный синтаксический анализатор MySQL сравнивает слова со списком стоп-слов. Если слово совпадает со словом из списка стоп-слов, оно исключается из индекса. Для парсера ngram обработка стоп-слов выполняется по-другому. Вместо исключения токенов, которые равны словам из списка стоп-слов, парсер ngram исключает токены, содержащие стоп-слова. Например, предполагая ngram_token_size=2, документ, содержащий “a,b”, анализируется как “a,” и “,b”. Если запятая (“,”) определена как стоп-слово, и “a,”, и “,b” исключаются из индекса, потому что они содержат запятую.
По умолчанию парсер ngram использует список стоп-слов по умолчанию, который содержит список английских стоп-слов. Для списка стоп-слов, применимого к китайскому, японскому или корейскому языкам, необходимо создать свой собственный. Сведения о создании списка стоп-слов см. в разделе 14.9.4 «Стоп-слова полнотекстового поиска».
Стоп-слова, длина которых больше ngram_token_size, игнорируются.
Поиск терминов парсером ngram
Для поиска в режиме естественного языка поисковый термин преобразуется в объединение терминов ngram. Например, строка “abc” (при условии ngram_token_size=2) преобразуется в “ab bc”. Если два документа, один из которых содержит “ab”, а другой — “abc”, поисковый термин “ab bc” совпадает с обоими документами.
Для поиска в булевом режиме поисковый термин преобразуется в поиск ngram-фразы. Например, строка 'abc' (при условии ngram_token_size=2) преобразуется в '“ab bc”'. Если два документа, один из которых содержит 'ab', а другой — 'abc', поисковая фраза '“ab bc”' соответствует только документу, содержащему 'abc'.
Поиск с подстановкой парсером ngram
Поскольку индекс ngram FULLTEXT содержит только ngram и не содержит информации о начале терминов, поиск с подстановкой может давать неожиданные результаты. Следующее поведение относится к поиску с подстановкой, использующему индексы полнотекстового поиска ngram FULLTEXT:
Если префиксный термин поиска с подстановкой символов меньше размера токена ngram, запрос возвращает все индексированные строки, содержащие токены ngram, начинающиеся с префиксного термина. Например, предполагая
ngram_token_size=2, поиск по “a*” возвращает все строки, начинающиеся с “a”.Если префиксный термин поиска с подстановкой символов длиннее размера токена ngram, префиксный термин преобразуется в фразу ngram, а оператор подстановки символов игнорируется. Например, предполагая
ngram_token_size=2, поиск с подстановкой символов “abc*” преобразуется в “ab bc”.
Поиск фраз с помощью парсера ngram
Поиск фраз преобразуется в поиск фраз ngram. Например, фраза поиска “abc” преобразуется в “ab bc”, которая возвращает документы, содержащие “abc” и “ab bc”.
Фраза поиска “abc def” преобразуется в “ab bc de ef”, которая возвращает документы, содержащие “abc def” и “ab bc de ef”. Документ, содержащий “abcdef”, не возвращается.
© 2025 Oracle
Licensed under the GPLv2 License.