10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

12.10.8 ngram全文解析器

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

请注意

MySQL还为日语提供了一个MeCab全文解析器插件,它将文档标记为有意义的单词。有关更多信息,请参见第12.10.9节,“MeCab全文解析器插件”

的连续序列n从给定文本序列中的字符。ngram解析器将一个文本序列标记为一个连续的n字符。例如,您可以令牌化abcd的不同值n使用ngram全文解析器。

n = 1: ' a ', ' b ', ' c ', ' d ' n = 2:“ab”、“公元前”、“cd”n = 3:“abc”,bcd的n = 4:“abcd”

ngram全文解析器是一个内置的服务器插件。与其他内置服务器插件一样,它在服务器启动时自动加载。

中描述的全文搜索语法第12.10节“全文查册功能”适用于ngram解析器插件。本节将描述解析行为的差异。与全文相关的配置选项,最小和最大字长选项除外(innodb_ft_min_token_size,innodb_ft_max_token_size,ft_min_word_len,ft_max_word_len)也同样适用。

配置ngram令牌大小

ngram解析器默认的ngram令牌大小为2 (bigram)。例如,当令牌大小为2时,ngram解析器将解析字符串abc def分为四个令牌:ab,公元前,而且英孚

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

通常情况下,ngram_token_size设置为要搜索的最大令牌的大小。如果只打算搜索单个字符,请设置ngram_token_size为1。令牌大小越小,全文搜索索引越小,搜索速度越快。如果需要搜索包含多个字符的单词,请设置ngram_token_size相应的行动。例如,生日快乐生日快乐简体中文,其中生日生日,快乐可以翻译为快乐.要搜索这样的双字符词,请设置ngram_token_size到2或更高的值。

作为只读变量,ngram_token_size只能作为启动字符串或配置文件的一部分设置:

  • 启动字符串:

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

    (mysqld) ngram_token_size = 2
请注意

以下最小和最大字长配置选项将被忽略全文使用ngram解析器的索引:innodb_ft_min_token_size,innodb_ft_max_token_size,ft_min_word_len,ft_max_word_len

创建一个使用ngram解析器的全文索引

创建一个全文使用ngram解析器的索引,指定与解析器ngram创建表,ALTER TABLE,或创建索引

下面的示例演示使用ngram全文索引,插入样例数据(简体中文文本),并在INFORMATION_SCHEMA。INNODB_FT_INDEX_CACHE表格

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;SET NAMES utf8mb4;插入文章(标题、主体)值(“数据库管理”,“在本教程中我将向你展示如何管理数据库”),(“数据库应用开发”,“学习开发数据库应用程序”);SET GLOBAL innodb_ft_aux_table="test/articles";SELECT * FROM INFORMATION_SCHEMA。INNODB_FT_INDEX_CACHEORDER BY doc_id, position;

添加一个全文索引到现有表,您可以使用ALTER TABLE创建索引.例如:

CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT) ENGINE=InnoDB CHARACTER SET utf8;添加全文索引ft_index(标题,正文)#或者:创建全文索引ft_index ON article (title,body) WITH PARSER ngram

解析器空间处理

ngram解析器在解析时消除了空格。例如:

  • ab cd是解析ab,cd

  • 一个公元前是解析公元前

ngram解析器停止字处理

内置的MySQL全文解析器将单词与停止词列表中的条目进行比较。如果一个词等于停止词列表中的一个条目,则该词将从索引中排除。对于ngram解析器,终止字处理的执行方式不同。ngram解析器不排除与停止词列表中的条目相等的标记,而是排除包含stopwords。例如,假设ngram_token_size = 2,一个包含a、b是解析一个,而且b.如果逗号(,)被定义为一个停止词,两者都是一个,而且b被排除在索引之外,因为它们包含逗号。

默认情况下,ngram解析器使用默认的停止词列表,它包含一个英语停止词列表。对于适用于汉语、日语或韩语的停词列表,您必须创建自己的停词列表。有关创建停止词列表的信息,请参见第12.10.4节“全文停止词”

长度大于ngram_token_size将被忽略。

解析器术语搜索

自然语言模式搜索时,搜索项被转换为ngram项的联合。例如,字符串美国广播公司(假设ngram_token_size = 2)转换为ab公元前.给出两份文件,其中一份包含ab另一个包含美国广播公司,搜索项ab公元前匹配两个文档。

布尔搜索模式,搜索词被转换为ngram短语搜索。例如,字符串'abc'(假设ngram_token_size = 2)转换为'ab公元前”。给定两个文档,一个包含'ab',另一个包含'abc',搜索短语'ab公元前'只匹配包含'abc'的文档。

ngram解析通配符搜索

因为一个ngram全文索引只包含ngram,并且不包含关于术语开头的信息,通配符搜索可能返回意外的结果。以下行为适用于使用ngram的通配符搜索全文搜索索引:

  • 如果通配符搜索的前缀项小于ngram令牌的大小,查询将返回所有包含以前缀项开头的ngram令牌的索引行。例如,假设ngram_token_size = 2,在一个*返回从。开始的所有行一个

  • 如果通配符搜索的前缀项大于ngram令牌的大小,则将前缀项转换为ngram短语,并忽略通配符操作符。例如,假设ngram_token_size = 2,一个美国广播公司(abc) *通配符搜索转换为ab公元前

ngram语法分析器短语搜索

短语搜索被转换为ngram短语搜索。例如,搜索短语美国广播公司被转换为ab公元前,它返回包含美国广播公司而且ab公元前

搜索词abc def被转换为Ab BC de ef,它返回包含abc def而且Ab BC de ef.包含以下内容的文档六边形abcdef不是回来了。