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 MVCC机制原理详解
Apr 20 MySQL
正确使用MySQL update语句
May 26 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
关于MySQL中的 like操作符详情
Nov 17 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 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基础知识:函数基础知识
2006/12/13 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
thinkPHP查询方式小结
2016/01/09 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
更新修改后的Python模块方法
2019/03/03 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
预备党员转正思想汇报
2014/01/12 职场文书
中学生英语演讲稿
2014/04/26 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
秋季运动会加油词
2015/07/18 职场文书
运动会800米赞词
2015/07/22 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB