MySQL 全文索引使用指南


Posted in MySQL onMay 25, 2021

全文索引需要特殊的查询语法。有没有索引都可以进行全文检索,但是存在索引时会提高匹配的速度。全文索引的索引通过特殊的结构存储以便于找到文档中包含搜索关键字对应的内容。在我们日常生活中,最常见的全文检索就是网络搜索引擎。虽然,网络搜索引擎的数据里十分庞大,并且通常也不会使用关系型数据库,但是原理是相似的。

全文索引支持通过基于字符(CHAR、VARCHAR 和 TEXT 类型的列)的检索,也可以支持自然语言模式(Natural Language Mode, 默认)和布尔模式 (Boolean Mode)。例如我们搜索“数据库引擎”的时候,内容中包括“数据库”、“引擎”和“数据库引擎”的内容都会检索出来。全文索引的实现有大量的限制,而且十分复杂。但是由于内置在MySQL服务端,而且对很多应用都能够满足要求,因此被广泛使用。

在MySQL5.6之前的版本中,只有 MyISAM 存储引擎支持全文索引。创建全文索引需要指定列标记为全文索引,如下面的 content 列。

CREATE TABLE t_news (
	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
	content TEXT,
	author VARCHAR(32),
	title VARCHAR(128),
  FULLTEXT (content)
) ENGINE=InnoDB;

MySQL 5.6以前对中文搜索支持不是太好,需要自己进行分词后将段落预处理拆分成单词在入库。MySQL5.7.6后才有了内置的分词器 ngram。ngram 支持设置设置分词的长度,可以将中文按长度拆分为不同的单词(虽然不太智能,但满足大部分场景)。可以通过 MySQL 的全局变量ngram_token_size设置分词长度,默认是2,支持1-10可选。对于上面的例子,需要指定分词器构建全文索引。

CREATE TABLE t_news (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
	content TEXT,
	author VARCHAR(32),
	title VARCHAR(128),
  FULLTEXT KEY idx(content) WITH PARSER ngram
) ENGINE=InnoDB;

插入一条数据测试。

INSERT INTO `t_news` 
(`id`, `content`, `author`, `title`) 
VALUES ('1', '我有一个数据库和引擎', '岛上码农', '数据库引擎');

在简单的模糊搜索中可以使用 LIKE 来完成,而对于全文检索需要使用如下方式的语句:

SELECT * FROM t_news 
WHERE MATCH (content) AGAINST ('数据 引擎' IN NATURAL LANGUAGE MODE)

通过这种方式可以检索出刚刚插入的内容,而如果使用 LIKE 是没法完成的。也支持使用相关性排序,再插入一条数据:

INSERT INTO `t_news`
(`id`, `content`, `author`, `title`) 
VALUES (2,'我有一个数据库','岛上码农','数据库')

然后执行排序查询:

SELECT *, MATCH (content) AGAINST ('数据 引擎' ) AS relevance
FROM t_news 
WHERE MATCH (content) AGAINST ('数据 引擎' ) 
ORDER BY relevance ASC

这里将匹配值作为一列查询,以便使用其别名进行排序。相关性越高,对应的 relevance 值越大,因此可以用作排序。入股不相关,那么 relevance 的值为0。

布尔模式可以做更多的控制,例如包括使用+号保留匹配结果和使用-号排除匹配结果,下面的就匹配了数据,而排除了包含引擎的数据。更多操作符可以参考 MySQL 的官方文档:全文索引操作符

SELECT * FROM t_news 
WHERE MATCH (content) AGAINST ('+数据* -引擎' IN BOOLEAN MODE);

以上就是MySQL 全文索引使用指南的详细内容,更多关于MySQL 全文索引的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL root密码的重置方法
Apr 21 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
52条SQL语句教你性能优化
May 25 #MySQL
简单了解 MySQL 中相关的锁
mysql在项目中怎么选事务隔离级别
.Net Core导入千万级数据至Mysql的步骤
May 24 #MySQL
MySQL大小写敏感的注意事项
May 24 #MySQL
MySQL 使用事件(Events)完成计划任务
May 24 #MySQL
MySQL触发器的使用
May 24 #MySQL
You might like
据说是雅虎的一份PHP面试题附答案
2009/01/07 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
EsLint入门学习教程
2017/02/17 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
基于JSON数据格式详解
2017/08/31 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
Python字符串处理实例详解
2017/05/18 Python
对python中的pop函数和append函数详解
2018/05/04 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
python实现定时发送qq消息
2019/01/18 Python
python整合ffmpeg实现视频文件的批量转换
2019/05/31 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
大学生简单自荐信
2013/11/10 职场文书
大学生求职自荐信
2013/12/12 职场文书
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
兵马俑导游词
2015/02/02 职场文书
黄石寨导游词
2015/02/05 职场文书
2016国庆促销广告语
2016/01/28 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android