文档主页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  ngram 全文解析器

14.9.8 ngram 全文解析器

内置的 MySQL 全文解析器使用单词之间的空格作为分隔符来确定单词的开始和结束位置,这在处理不使用单词分隔符的表意语言时是一个限制。为了解决这个限制,MySQL 提供了一个支持中文、日语和韩语 (CJK) 的 ngram 全文解析器。ngram 全文解析器支持与 InnoDBMyISAM 一起使用。

注意

MySQL 还为日语提供了一个 MeCab 全文解析器插件,该插件将文档分解成有意义的单词。有关更多信息,请参阅 第 14.9.9 节“MeCab 全文解析器插件”

ngram 是从给定的文本序列中提取的连续 n 个字符的序列。ngram 解析器将文本序列分解成连续的 n 个字符的序列。例如,您可以使用 ngram 全文解析器为 n 的不同值对 abcd 进行标记化。

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_sizeinnodb_ft_max_token_sizeft_min_word_lenft_max_word_len) 外,与全文相关的配置选项也适用。

配置 ngram 标记大小

ngram 解析器默认的 ngram 标记大小为 2 (bigram)。例如,如果标记大小为 2,则 ngram 解析器将字符串 abc def 解析为四个标记:abbcdeef

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
注意

以下最小和最大词长配置选项对于使用 ngram 解析器的 FULLTEXT 索引将被忽略:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeft_min_word_lenft_max_word_len

创建使用 ngram 解析器的 FULLTEXT 索引

要创建使用 ngram 解析器的 FULLTEXT 索引,请在 CREATE TABLEALTER TABLECREATE INDEX 中指定 WITH PARSER ngram

以下示例演示了如何创建带有 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 TABLECREATE 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 解析为 abcd

  • 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=2abc* 通配符搜索将被转换为ab bc

Ngram 解析器短语搜索

短语搜索将被转换为 ngram 短语搜索。例如,搜索短语abc将被转换为ab bc,它将返回包含abcab bc的文档。

搜索短语abc def将被转换为ab bc de ef,它将返回包含abc defab bc de ef的文档。包含abcdef的文档不会被返回。