1.全文索引

全文索引,在MySQL5.6 之前 仅有myisam存储引擎支持,而在 5.6及以上 的版本中开始innodb支持全文索引,但是全文索引里的分词支持只有5.7及以上的版本才支持,5.6支持全文索引,但是不支持分词。所谓的分词就是会根据常用词库对目标语句进行拆解。所谓全文索引,是一种通过建立倒排索引,快速匹配文档的方式。

1.1 ngram全文解析器
ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:

n=1: ‘生’, ‘日’, ‘快’, ‘乐’
n=2: ‘生日’, ‘日快’, ‘快乐’
n=3: ‘生日快’, ‘日快乐’
n=4: ‘生日快乐’
给table添加全文索引sql示例:

alter table customers add fulltext index testfulltext(body) with parser ngram;

建表的时候创建 - 例子

CREATE TABLE articles (
 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
 title VARCHAR(200),
 body TEXT,
 FULLTEXT (body) WITH PARSER ngram
 ) ENGINE=InnoDB CHARACTER SET utf8mb4;


随便插入一些测试数据:
INSERT INTO test.articles (id, title, body) VALUES (‘1’, ‘’, ‘\r\n蕉下慢游系列太阳伞晴雨伞折叠女防晒伞防紫外线遮阳伞\r\n\r\n’);
INSERT INTO test.articles (id, title, body) VALUES (‘2’, NULL, ‘轩澜格北欧简约金属杆4头彩色玻璃吊灯 H58*W50CM DN1214’);
INSERT INTO test.articles (id, title, body) VALUES (‘3’, NULL, ‘海尔(Haier)扫地机器人TAB-JD3B0W全自动智能充电家用清扫机器人吸尘器 M-367PLUS’);
INSERT INTO test.articles (id, title, body) VALUES (‘4’, NULL, ‘格力(GREE) 空调扇冷暖两用家用智能WIFI控制冷风扇办公室移动节能冷风机KS-15X60RD 冷暖’);
INSERT INTO test.articles (id, title, body) VALUES (‘5’, NULL, ‘傲娇地方啦系带女士电视阿斯顿福建’);
INSERT INTO test.articles (id, title, body) VALUES (‘6’, NULL, ‘电 asdf 彩色’);

1.2 介绍两种全文索引的查询方式

1、按自然语言搜索模式查询

SELECT * FROM articles WHERE MATCH (body) AGAINST (‘我要彩色的电视’ IN NATURAL LANGUAGE MODE)

结果:

mysql 词条搜索 分词 mysql分词器_mysql 词条搜索 分词


2.按布尔全文搜索模式查询

匹配有"电视"的数据

SELECT * FROM articles WHERE MATCH (body) AGAINST (‘电视’ IN BOOLEAN MODE);

mysql 词条搜索 分词 mysql分词器_fulltext_02


匹配没有"电视"的数据

SELECT * FROM articles WHERE MATCH (body) AGAINST (’-电视’ IN BOOLEAN MODE);

匹配"电视"相关的数据

SELECT * FROM articles WHERE MATCH (body) AGAINST (’>电视’ IN BOOLEAN MODE);

mysql 词条搜索 分词 mysql分词器_mysql_03


需要注意的点:

以上的sql语句如果换成只有一个关键字来搜索是搜索不到任何数据的,比如

SELECT * FROM articles WHERE MATCH (body) AGAINST (’>电’ IN BOOLEAN MODE);

需要设置配置ngram令牌大小

mysql 词条搜索 分词 mysql分词器_fulltext_04

配置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启动时候加上参数或者在配置文件中进行配置
a.启动阶段设置

mysqld --ngram_token_size=2
 b.配置文件:
 [mysqld]
 ngram_token_size=2


参考:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html