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 使用SQL语句修改表名的实现
Apr 07 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL空间数据存储及函数
Sep 25 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
Python打印斐波拉契数列实例
2015/07/07 Python
Python实现堆排序的方法详解
2016/05/03 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
python实现AES加密和解密
2019/03/27 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
一套软件开发工程师笔试题
2015/05/18 面试题
JPA的特点
2014/10/25 面试题
开水果连锁店创业计划书
2013/12/29 职场文书
实习心得体会
2014/01/02 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
库房保管员岗位职责
2014/04/07 职场文书
合作协议书模板
2014/10/10 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书