Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  ngram Full-Text Parser

14.9.8 ngram 全文搜索解析器

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

Note

MySQL 还提供了一个 MeCab 全文搜索解析器插件,用于日文,tokenize 文档到有意义的单词。更多信息,请参阅 第 14.9.9 节,“MeCab 全文搜索解析器插件”

一个 ngram 是给定文本序列中的连续 n 个字符。ngram 解析器将文本序列 tokenize 成连续的 n 个字符。例如,您可以使用 ngram 全文搜索解析器 tokenize abcd,以不同的 n 值。

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 Token 大小配置

ngram 解析器的默认 ngram token 大小为 2(bigram)。例如,以 token 大小为 2,ngram 解析器将字符串 abc def tokenize 成四个 token:ab, bc, deef

ngram token 大小可以使用 ngram_token_size 配置选项配置,该选项的最小值为 1,最大值为 10。

通常,ngram_token_size 设置为您要搜索的最大 token 大小。如果您只想搜索单个字符,设置 ngram_token_size 为 1。较小的 token 大小将产生较小的全文搜索索引,并且搜索速度更快。如果您需要搜索多个字符的单词,设置 ngram_token_size 相应地。例如,Happy Birthday生日快乐,其中 生日birthday快乐 翻译为 happy。要搜索这类双字符单词,设置 ngram_token_size 为 2 或更高。

作为一个只读变量,ngram_token_size 只能在启动字符串或配置文件中设置:

  • 启动字符串:

    mysqld --ngram_token_size=2
  • 配置文件:

    [mysqld]
    ngram_token_size=2
Note

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

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

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

以下示例演示创建一个具有ngram FULLTEXT索引的表,插入示例数据(简体中文文本),并在信息架构INNODB_FT_INDEX_CACHE表中查看tokenized数据。

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解析器排除包含停止词的tokens。例如,假设ngram_token_size=2,一个包含a,b的文档被解析为a,,b。如果逗号(,)被定义为停止词,那么两个tokens都将被排除在索引之外,因为它们包含逗号。

默认情况下,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索引仅包含ngrams,不包含关于术语开头的信息,因此通配符搜索可能会返回意外的结果。以下行为适用于使用ngram FULLTEXT搜索索引的通配符搜索:

  • 如果通配符搜索的前缀术语短于ngram token大小,则查询将返回所有包含以前缀术语开头的ngram tokens的索引行。例如,假设ngram_token_size=2,搜索a*将返回所有以a开头的行。

  • 如果通配符搜索的前缀术语长于ngram token大小,则前缀术语将被转换为ngram短语,而通配符运算符将被忽略。例如,假设ngram_token_size=2,则abc*通配符搜索将被转换为ab bc

ngram解析器短语搜索

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

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