12.9.8 ngram Полный поиск по тексту
Встроенный MySQL полносправочный анализатор использует пробелы между словами в качестве разделителей для определения начала и конца слов, что является ограничением при работе с идеографическими языками, не использующими разделители слов. Чтобы решить эту проблему, MySQL предоставляет полносправочный анализатор ngram, поддерживающий китайский, японский и корейский языки (CJK). Полносправочный анализатор ngram поддерживается для использования с InnoDB и MyISAM.
MySQL также предоставляет плагин полносправочного анализатора MeCab для японского языка, который разбивает документы на осмысленные слова. Дополнительную информацию см. в Разделе 12.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 — это встроенный серверный плагин. Как и другие встроенные серверные плагины, он загружается автоматически при запуске сервера.
Синтаксис полносправочного поиска, описанный в Разделе 12.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” — это “生日快乐” на упрощенном китайском языке, где “生日” соответствует “birthday”, а “快乐” переводится как “happy”. Для поиска слов, состоящих из двух символов, таких как эти, установите 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 utf8;
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 использует стандартный список стоп-слов, который содержит список английских стоп-слов. Для списка стоп-слов, применимого к китайскому, японскому или корейскому языкам, необходимо создать свой собственный. Информацию о создании списка стоп-слов см. в Разделе 12.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.