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 20 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
带你学习MySQL执行计划
May 31 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP里的中文变量说明
2011/07/23 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
Django 中 cookie的使用
2017/08/17 PHP
JavaScript 注册事件代码
2011/01/27 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
python中map的基本用法示例
2018/09/10 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
促销活动策划方案
2014/01/12 职场文书
优秀求职信范文分享
2014/01/26 职场文书
售后客服工作职责
2014/06/16 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers