mysql中使用全文检索(让你看完就有收获)

  • Post author:
  • Post category:mysql




前言

最近复习数据库时到索引部分时,看到了全文检索,虽然平台用到的不是太多,但是出于好奇的心态,还是找了相关资料好好研究了一番,下面将我所学的分享给大家,希望对你们能有所帮助。



一、全文索引是什么?

通俗点来说,全文检索主要同于搜索引擎中,像百度搜索、谷歌搜索等以及其他的大数据搜索,像我们平时建立的数据库(数据量不是很大的情况),基本用不到全文检索,用普通的查询就能满足大部分需求,扯了这么多没用的,下面开始进入正题



二、使用步骤



1.建立数据表


其中FULLTEXT KEY

full

(

empName

,

empPass

,

empPhone

)意思是为这三个字段设置全文索引


Create Table

CREATE TABLE `emp` (
  `empId` int NOT NULL AUTO_INCREMENT,
  `empName` varchar(255) NOT NULL,
  `empPass` varchar(255) NOT NULL,
  `empPhone` varchar(255) NOT NULL,
  PRIMARY KEY (`empId`),
  FULLTEXT KEY `full` (`empName`,`empPass`,`empPhone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

除此外还可以直接通过数据库视图软件直接建立,我用的是SQLyog,如下:

在这里插入图片描述

建完表后插入四条数据

INSERT INTO emp(empName,empPass,empPhone) VALUES('a','123456','13245878952');
INSERT INTO emp(empName,empPass,empPhone) VALUES('aa','123456','13245878952');
INSERT INTO emp(empName,empPass,empPhone) VALUES('aaa','123456','13245878952');
INSERT INTO emp(empName,empPass,empPhone) VALUES('aaaa','123456','13245878952');

关于这里为啥插入四条,看完下面的你就明白了



2.查询数据


代码如下(示例):全文检索的查询方式和普通查询方式是不一样的,全文检索是使用match和against关键字进行查询的,而match中的列必须要和设置全文索引的列对应,至于against中则填写的是你要查询的内容

SELECT * FROM emp WHERE MATCH(empName,empPass,empPhone) AGAINST('a');

输入这段查询代码后,正常的思维应该是查询出四条数据,但是结果却是一条都没查出来

在这里插入图片描述



3.原因分析

造成这种原因的是因为InnoDB的默认机制,其默认为输入的查询体的长度只能在4~84之间,这就是常见的

最小搜索长度

而我们刚才输入的a 却只有一个长度,所以是查询不到的,同理,输入两个a和三个a也是查询不到的,这里我就不贴出代码了,你们可以自己尝试一下。但是,当你输入四个a时,查询内容就出来啦,原因就是因为四个a的长度刚好为四,满足这个条件。初次外还有一个原因就是如果你数据库中的数据小于四条的话,那么也是查不出来的,同上面最小搜索长度一样,也是因为默认配置的原因,这里我就不介绍了,直接带大家来修改默认配置。

SHOW VARIABLES LIKE '%ft%'

在这里插入图片描述



3.修改配置

mysql中的全文索引相关参数无法进行动态修改,只能通过修改配置文件来完成,修改最小搜索的长度为1的配置。在my.ini中的mysqld中添加以下代码

[mysqld]
innodb_ft_min_token_size = 1
ft_min_word_len = 1

在这里插入图片描述

在这里插入图片描述

添加完配置后需要重启mysql服务,并且进行索引修复

  1. 索引修复

    直接输入这行代码就完事(这里的emp是表名称)
repair table emp quick;
  1. 重启mysql服务器

    点击win+x——》然后再点击G就行了,不同的计算机点的字母不一样,总之就是打开计算机管理

    或者直接鼠标放在计算机上然后右键 有个管理,打开就行,然后找到服务

    在这里插入图片描述

    右击mysql选择重新启动就行啦。



4.进行测试

分别输入1到4个a,都能显示结果,但是结果就只有一条,如果想获取多条,需要换一种写法,用布尔全文检索

select * from emp where match(empName,empPass,empPhone) against('a*' in boolean mode);

在这里插入图片描述

我这里之所以显示三条,是因为id为1的数据刚才被我删了,正常的话是有四条数据的。



5.布尔全文检索

再用布尔全文检索时,我们可以自定义检索体的相关性,可以通过一些前缀修饰符来定制搜索。

mysql中内置的修饰符常用的有下面几个


  • +

    必须包含该词



  • 必须不包含该词

  • >

    提高该词的相关性,查询的结果靠前

  • <

    降低该词的相关性,查询的结果靠后

  • (*)星号

    通配符,只能接在词后面

    在这里插入图片描述

    更多的解释可以问问度娘



三、总结

写了这么多,也到了该总结的时候了,首先就是自己得多练习几次,因为如果只是跟着博客写一遍的话效果不是很理想,你要多变化几个查询体条件来进行查询,其次就是要多看看其他的相关博客,然后自己进行总结,能让自己真正的理解,好了,要说的就这么多,祝大家都能学有所成。



版权声明:本文为hello_boyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。