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 使用事件(Events)完成计划任务
May 24 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 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/08 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
javascript new一个对象的实质
2010/01/07 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
Python 文件重命名工具代码
2009/07/26 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
学习雷锋月活动总结
2014/07/03 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
个人年度总结报告
2015/03/09 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL