ngram全文分析器
内置的MySQL全文分析器使用单词之间的空白作为定界符来确定单词的开始和结束位置,这在使用不使用单词定界符的表意语言时是一个限制。为了解决此限制,MySQL提供了一个支持中文,日语和朝鲜语(CJK)的ngram全文语法分析器。支持将ngram全文分析器与InnoDB
和一起使用MyISAM
。
注意MySQL还为日语提供了MeCab全文解析器插件,该插件将文档标记化为有意义的单词。有关更多信息,请参见“ MeCab全文分析器插件”。
ngram是n
来自给定文本序列的连续字符序列。ngram解析器将文本序列标记为连续的n
字符序列。例如,您可以使用ngram全文分析器将“ abcd ”标记为不同的值n
。
n=1: 'a', 'b', 'c', 'd' n=2: 'ab', 'bc', 'cd' n=3: 'abc', 'bcd' n=4: 'abcd'
ngram全文语法分析器是内置的服务器插件。与其他内置服务器插件一样,启动服务器时会自动加载该插件。
“全文搜索功能”中描述的全文搜索语法适用于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 ”,“ bc ”,“ de ”和“ ef ”。
可以使用ngram_token_size
配置选项来配置ngram令牌大小,该选项的最小值为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
注意下面的最小和最大字长配置选项被忽略
FULLTEXT
的是使用NGRAM解析器指标:innodb_ft_min_token_size
,innodb_ft_max_token_size
,ft_min_word_len
,和ft_max_word_len
。
创建使用ngram解析器的FULLTEXT索引
要创建FULLTEXT
一个使用NGRAM解析器指数,指定WITH PARSER ngram
用CREATE TABLE
,ALTER TABLE
或CREATE INDEX
。
下面的示例演示了如何创建具有ngram
FULLTEXT
索引的表,插入示例数据(简体中文文本)以及在INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE
表中参见标记化数据。
mysql>USE test; mysql>CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULLPRIMARY KEY , title VARCHAR(200), body TEXT,FULLTEXT (title,body)WITH PARSER ngram )ENGINE =InnoDBCHARACTER 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_CACHEORDER BY doc_id, position;
要将FULLTEXT
索引添加到现有表中,可以使用ALTER TABLE
或CREATE INDEX
。例如:
CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULLPRIMARY KEY , title VARCHAR(200), body TEXT )ENGINE =InnoDBCHARACTER SET utf8;ALTER TABLE articlesADD FULLTEXT INDEX ft_index (title,body)WITH PARSER ngram; # Or:CREATE FULLTEXT INDEX ft_indexON 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解析器使用默认停用词列表,其中包含英语停用词列表。对于适用于中文,日语或韩语的停用词列表,您必须创建自己的停用词。有关创建停用词列表的信息,请参见“全文停用词”。
停用词的长度大于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解析器通配符搜索
因为FULLTEXT
ngram索引仅包含ngram,并且不包含有关术语开头的信息,所以通配符搜索可能返回意外结果。以下行为适用于使用ngram FULLTEXT
搜索索引的通配符搜索:
- 如果通配符搜索的前缀词短于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 ”的文档。