Spec-Zone.ru › MySQL 9.2

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

Spec-Zone.ru

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