一:概念
全文索引与普通的索引不是一回事,在查找上方面其效率是普通模糊(like)查询和N倍,是MySQL专门提供用作搜索引擎的
二:版本支持
Mysql 5.6之前版本,只有MyISAM支持全文索引,5.6之后,Innodb和MyISAM均支持全文索引
另外,只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引
三:ngram解析器
5.6之后MySQL自带ngram解析器,可以解析中日韩三国文字,如果不使用ngram解析器,则MySQL默认使用空格与符号作为分隔符(对于英文自然够用了,但对于中日韩文字就不好用了,所以才需要ngram解析器)
四:开始使用
1:创建索引
用可视化工具创建就好了
2:查询语句
全文索引有专用的查询语法:match(字段) against(关键字)
select * from answer where match(content) against("测试表")
3:为了更好的搜索效果,通常会配置最小搜索长度
全文索引的相关参数都无法进行动态修改**,必须通过修改MySQL的配置文件来完成**。通常修改最小搜索长度的值为2,首先打开MySQL的配置文件 (MySQL8.0的配置文件为:my.ini),在 [mysqld] 的下面追加以下内容
// MyISAM
ft_min_word_len = 4; 默认值
ft_max_word_len = 84; 默认值
// InnoDB
innodb_ft_min_token_size = 3; 默认值
innodb_ft_max_token_size = 84; 默认值
//ngram解析器令牌长度----即against()中字符串切分的最小字符长度
ngram_token_size = 2~10 ; 默认值
一般设定:(以下例子均是假定设置如下)
在 [mysqld]的下面追加:
innodb_ft_min_token_size = 2
ft_min_word_len = 2
ngram_token_size = 2
查看该变量的语法:
show variables like "%ft%"
show variables like "%ngram%"
在配置完参数之后,然后重启 MySQL 服务器,(不会重启,这里我用了最土的方法,直接重启电脑)并删除原先的索引,重新创建
注意,修改完参数以后,一定要重启电脑(或重启MySQL)并重新创建(或修复)索引,不然参数不会生效
五:三种全文搜索模式
1:自然语言模式(IN NATURAL LANGUAGE MODE,默认情况下为该模式)
SELECT * FROM user WHERE MATCH(userName) AGAINST ('张三');
如果最小搜索长度为1的话,则查找包含张,或三,或张三的记录;与布尔搜索模式中的‘+张三’结果相同
2:布尔搜索模式(IN BOOLEAN MODE)
-
【+】----------必须包含此字符串
-
【-】----------必须不包含此字符串
-
【“ ”】--------双引号内作为整体不能拆词
-
【> 】--------提高该词的相关性,查询的结果靠前
-
【< 】--------降低该词的相关性,查询的结果靠后
-
【*】---------通配符,只能接在词后面
-
等
SELECT * FROM user WHERE MATCH(userName) AGAINST ('+"美女" & +"动人"' IN BOOLEAN MODE);
转载来源:zhuanlan.zhihu.com/p/417229576
感谢作者辛勤付出