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” — это “生日快乐” на упрощенном китайском языке, где “生日” — это “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 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 и не содержит информации о начале терминов, поиск с подстановкой может давать неожиданные результаты. Следующее поведение относится к поиску с подстановкой с помощью индексов поиска FULLTEXT ngram:
Если префиксный термин поиска с подстановкой символов короче размера токена 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.