mysql的全文索引

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)
结果:
在这里插入图片描述
2.按布尔全文搜索模式查询
匹配有"电视"的数据
SELECT * FROM articles WHERE MATCH (body) AGAINST (‘电视’ IN BOOLEAN MODE);
在这里插入图片描述
匹配没有"电视"的数据
SELECT * FROM articles WHERE MATCH (body) AGAINST (’-电视’ IN BOOLEAN MODE);
匹配"电视"相关的数据
SELECT * FROM articles WHERE MATCH (body) AGAINST (’>电视’ IN BOOLEAN MODE);
在这里插入图片描述
需要注意的点:
以上的sql语句如果换成只有一个关键字来搜索是搜索不到任何数据的,比如
SELECT * FROM articles WHERE MATCH (body) AGAINST (’>电’ IN BOOLEAN MODE);
需要设置配置ngram令牌大小
在这里插入图片描述配置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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值