本篇文章为大家展示了mysql5.7全文索引不支持中文分词怎么办,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文,日文,韩文分词。
本文使用的MySQL版本是5.7.22,InnoDB数据库引擎。
ngram全文解析器
ngram就是一段文字里面连续的n个字的序列.ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:
n=1:, & # 39;生& # 39;,& # 39;日& # 39;,& # 39;快& # 39;,& # 39;乐& # 39;, n=2:, & # 39;生日& # 39;,,& # 39;日快& # 39;,,& # 39;快乐& # 39;, n=3: & # 39;生日快& # 39;,,& # 39;日快乐& # 39;, n=4:, & # 39;生日快乐& # 39;
MySQL中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2 .
全局变量ngram_token_size的两种设置方法:
1,启动mysqld命令时
mysqld ——ngram_token_size=2
2,修改MySQL配置文件
(mysqld), ngram_token_size=2
创建全文索引
1,创建表的同时创建全文索引
CREATE TABLE articles ( ,,,id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY 键, ,,,title VARCHAR (200), ,,,body 文本, ,,,FULLTEXT (标题、,正文),WITH PARSER ngram ),ENGINE =, INNODB。
2,通过alter table的方式来添加
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (标题、主体),WITH PARSER ngram;
3,直接通过创建索引的方式
CREATE FULLTEXT INDEX ft_index 提醒articles (标题、主体),WITH PARSER ngram;
全文检索模式
常用的全文检索模式有两种:
1,自然语言模式(自然语言模式),
自然语言模式是MySQL默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。
2,布尔模式(布尔模式)
布尔模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。
示例
SELECT *,得到的文章 WHERE MATCH (标题、身体) AGAINST (& # 39;一路,一带& # 39;,拷贝NATURAL LANGUAGE 模式);//,不指定模式,默认使用自然语言模式 SELECT *,得到的文章 WHERE MATCH (标题、身体) AGAINST (& # 39;一路,一带& # 39;);
示例
上面的示例返回结果会自动按照相关性排序,相关性高的在前面。相关性的值是一个非负浮点数,0表示无相关性。
//,获取相关性的值 SELECT id、标题 MATCH (标题、身体),AGAINST (& # 39;手机& # 39;,拷贝NATURAL LANGUAGE 模式),AS 分数 得到的文章 ORDER BY  score DESC;
示例
//,获取匹配结果记录数 SELECT COUNT(*),得到的文章 WHERE MATCH (标题、身体) AGAINST (& # 39;一路,一带& # 39;,拷贝NATURAL LANGUAGE 模式),
可以使用布尔模式执行高级查询。
//,必须包含“腾讯“; SELECT *,得到的文章 WHERE MATCH (标题、身体) AGAINST (& # 39; +腾讯& # 39;,拷贝BOOLEAN 模式),
示例
//,必须包含“腾讯“,但是不能包含“通讯工具“; SELECT *,得到的文章 WHERE MATCH (标题、身体) AGAINST (& # 39; +腾讯,——通讯工具& # 39;,拷贝BOOLEAN 模式),
示例
下面的例子演示了布尔模式下运算符的使用方式:
& # 39; apple 香蕉,, 无操作符,表示,或要么包含苹果,要么包含香蕉 & # 39;+ apple +果汁# 39; 必须同时包含两个词 & # 39;+ apple macintosh # 39; 必须包含苹果,但是如果也包含macintosh的话,相关性会更高。 & # 39;+ apple -macintosh& # 39; 必须包含苹果,同时不能包含麦金塔电脑。 & # 39;+ apple ~ macintosh # 39; 必须包含苹果,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。 & # 39;+ apple +(在juice & lt;派)& # 39; 查询必须包含苹果和果汁或者苹果和蛋糕的记录,但是apple 果汁的相关性要比apple 派高。 & # 39;苹果* & # 39; 查询包含以苹果开头的单词的记录,如苹果,苹果,applet。 & # 39;“some words" & # 39; 使用双引号把要搜素的词括起来,效果类似于like & # 39; % some 词汇% & # 39; 例如“some words of 智慧”会被匹配到,而“some noise 词”就不会被匹配。mysql5.7全文索引不支持中文分词怎么办