Spec-Zone.ru › MySQL 8.4

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/fulltext-search-ngram.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API