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 infobright的安装步骤
Apr 07 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
Mysql 用户权限管理实现
May 25 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
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+mysql保存和输出文件
2006/10/09 PHP
PHP的FTP学习(一)
2006/10/09 PHP
php不写闭合标签的好处
2014/03/04 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
python flask安装和命令详解
2019/04/02 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
先进员工获奖感言
2014/08/14 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书