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 视图(View)原理解析
May 19 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MYSQL如何查看操作日志详解
May 30 MySQL
MySQL深分页问题解决思路
Dec 24 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php 问卷调查结果统计
2015/10/08 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
jquery ajax 局部刷新小案例
2014/02/08 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
python的mysqldb安装步骤详解
2017/08/14 Python
Python 私有函数的实例详解
2017/09/11 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
英语专业职业生涯规划范文
2014/03/05 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
公司承诺书怎么写
2014/05/24 职场文书
书法大赛策划方案
2014/06/04 职场文书
大学生找工作求职信
2014/07/09 职场文书
升职自荐信怎么写
2015/03/05 职场文书
企业计划生育责任书
2015/05/09 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android