内置的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”不是回来了。