mysql全文检索与模糊查询
mysql数据库进阶学习 二
- 全文检索
- 模糊查询 like用法
- 正则表达
全文检索
新建全文检索方式(支持中文全文检索):
本文使用mysql数据库版本为5.7+,InnoDB数据库引擎
全文检索解析器ngram(解决不支持中文检索方式,版本要求5.7.6+,为mysql内置插件,不需要安装,默认支持检索最短字符为2,即不支持单个字如’国’检索)
alter table news_info add fulltext index ft_in(title,category) with parser ngram;
第二种建立全文检索方法:
create fulltext index 检索名词(如:ft_in) on table_name(检索列名) with parser ngram;
其中fulltext表示全文,index索引,ft_in检索名称,(title,category)表示要设置全文检索的字段名,parser ngram即使用ngram全文解析。
执行完成后,就可以通过一下语句检索:
select *from news_info where match(title,category) against('中国' in boolean mode);
查询结果如下:
首先解释一下sql语句,使用全文检索的格式:
select xxx from table_name where
match(自己设置的检索字段名) against('xx' in boolean mode);
关于设置ngram的最短检索字符值,请自行百度。
使用全文检索在数据量较大的情况下,比(like’’)模糊查询要更快一筹。
模糊查询 like用法
其实使用全文检索也可以达到模糊查询的效果,这里不做比较
注意使用like方法实现模糊查询会使建立好的索引失效(前提是你查询的字段名不是你建立的索引,例:我查询name,where条件是phone like‘%XXX%’其中phone设置了索引,但是name没有,那模糊查询就不会使用索引,如果查询的是phone,则模糊查询还是会使用索引,这是一个很细的细节哦)
关于检索的用法请看: mysql复合索引
使用sql语句:
select title from news_info where title like '%中国%'
这种like '%X%'是指查询包括x的所有数据,%指的是X之前无数个字符,或是X之后无数个字符
查询结果:
我们可以看到使用了like’%中国%’,查询到的结果是所有包含中国的数据,无论中国所属的位置。我为什么要说所属的位置呢,因为如果查询条件换成like’中%'即输入如下:
select title from news_info where title like'中%'
我们发现查询到的数据都是中国开头的,我们继续输入查询语句(这里就不查中了,因为数据库里没有以中为结尾的):
select title from news_info where title like'%会'
结果如下:
我们发现查询到的数据都是末尾为会的。
我们总结一下:
'%X%'表示查询所有包含X的数据,不管位置。
'X%'表示查询以X为开头的数据。
'%X’表示查询以X为末尾的数据。
%表示n个字符。
检查自己是否使用了索引只需要在select的前面加上explain,即:
explain select title from news_info where title like '%中国%'
其中title字段设置了索引,所以下面查询显示的key存在,且type为index检索。
换一下查询内容:
explain select * from news_info where title like'%中%'
我们可以看到type是所有,且key为空,即没有用到索引。
正则表达
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
---|---|
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
通过实例讲解:
输入以下sql语句:
select title from news_info where title regexp '^中'
查询结果为:
出来这个结果应该很熟悉吧,比较上面的like用法也查出来过,通过查询的内容,我们发现regexp '^X’表示查询以X为开头的数据。
输入如下:
select title from news_info where title regexp '会$'
表示查询以会为结尾的数据
Sxiaocai: 请问,我使用的也是和博主相同的版本,但是就是连接数据库为null是怎么回事啊,就是在localhost上,用户密码都是对的
2201_75517443: 大神您好,我(纯小白)想请问一下简易音乐专栏里的简易音乐一里面的第四步那个APP进程java添加在那个Java文件里,还是说要单独在项目里新建一个java然后把第四步的代码放进去呢?
城南花已开�280: up主请问一下为啥导入成功以后data.getProfile()、getData()还是会爆红
bhi: OK,谢谢老哥
雪の星空朝酱: 这个账号是你自己网易云账号,做的简单的demo,没有注册功能,如果你要是毕设做这种的话我建议你是去github上面搜索成熟的仿网易云音乐项目比较好