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 05 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
MySQL 数据 data 基本操作
May 04 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
mysql幻读详解实例以及解决办法
Jun 16 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
面试官问我Mysql的存储引擎了解多少
Aug 05 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
PHP 高手之路(二)
2006/10/09 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
浅析Python中的多条件排序实现
2016/06/07 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
美国温暖商店:The Warming Store
2018/12/15 全球购物
华为python面试题
2016/05/03 面试题
如何写出好的Java代码
2014/04/25 面试题
实习评语
2013/12/16 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
捐款活动总结
2014/08/27 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
督导岗位职责
2015/02/04 职场文书
优秀大学生申请书
2019/06/24 职场文书