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知识点整理
Apr 05 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
深入解析MySQL索引数据结构
Oct 16 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL 原理与优化之Update 优化
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常量的详解
2013/06/09 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
理解AngularJs指令
2015/12/10 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Python函数学习笔记
2008/10/07 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
分析python切片原理和方法
2017/12/19 Python
理解python中生成器用法
2017/12/20 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
社会学专业学生职业规划书
2014/02/07 职场文书
摄影展策划方案
2014/06/02 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
运动会5000米加油稿
2015/07/21 职场文书
手残删除python之后的补救方法
2021/06/26 Python