Spec-Zone.ru › MySQL 5.7

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

Spec-Zone.ru

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