Mysql使用全文索引(FullText index)的实例代码


Posted in MySQL onApril 03, 2022

什么是全文索引

全文索引,通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题. 例如: 有title字段,需要查询所有包含 "政府"的记录. 需要 like "%政府%"方式查询,查询速度慢,当查询包含"政府" OR "中国"的需要是,sql难以简单满足.全文索引就可以实现这个功能.

倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

注意

在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.

创建全文索引

  • 创建表的时候创建
CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR (200),
    body TEXT,
    FULLTEXT (title, body) WITH PARSER ngram
) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';

创建了一个给title和body字段添加全文缩影的表

  • 给字段添加全文索引 ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;

使用全文索引

MySQL的全文索引查询有多种模式

自然语言搜索

普通的判断是否包含

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神' IN NATURAL LANGUAGE MODE);
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神');
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)
可以看到,搜索结果命中了一条,且在不指定搜索模式的情况下,默认模式为自然语言搜索.

BOOLEAN MODE

这个模式和lucene中的BooleanQuery很像,可以通过一些操作符,来指定搜索词在结果中的包含情况.比如 + 表示必须包含 , -表示必须不包含,默认为误操作符,代表可以出现可以不出现,但是出现时在查询结果集中的排名较高一些.也就是该结果和搜索词的相关性高一些.

具体包含的所有操作符可以通过MySQL查询来查看:

show variables like '%ft_boolean_syntax%'

+-------------------+----------------+
| Variable_name     | Value          |
+-------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
+-------------------+----------------+
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神' IN BOOLEAN MODE);
+----+-----------------+-------------------------+
| id | title           | body                    |
+----+-----------------+-------------------------+
|  1 | 弘扬正能量      | 贯彻党的18大精神        |
+----+-----------------+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神 -贯彻' IN BOOLEAN MODE);
Empty set (0.01 sec)
当搜索必须命中精神时,命中了一条数据,当在加上不能包含贯彻的时候,无命中结果.

强烈注意:MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

注:目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。

注:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。

总结

到此这篇关于Mysql使用全文索引(FullText index)的文章就介绍到这了,更多相关Mysql使用全文索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL慢查询的坑
Apr 28 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL约束超详解
Sep 04 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
解析MySQL索引的作用
Mar 03 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
php防攻击代码升级版
2010/12/29 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
简单了解python协程的相关知识
2019/08/31 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
城市规划毕业生求职信
2013/10/10 职场文书
会计出纳岗位职责
2013/12/25 职场文书
年度考核自我鉴定
2014/03/19 职场文书
教师节活动主持词
2014/04/02 职场文书
企业标语大全
2014/07/01 职场文书
个人向公司借款协议书
2014/10/09 职场文书
校长个人总结
2015/03/03 职场文书
文员岗位职责范本
2015/04/16 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python