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
mysql死锁和分库分表问题详解
Apr 16 MySQL
MySQL优化之如何写出高质量sql语句
May 17 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
Mysql中常用的join连接方式
May 11 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php对数组排序的简单实例
2013/12/25 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
php图像验证码生成代码
2017/06/08 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
如何编写jquery插件
2017/03/29 jQuery
vue-cli中的webpack配置详解
2017/09/25 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
给Python初学者的一些编程技巧
2015/04/03 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python pandas 时间日期的处理实现
2019/07/30 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
动物科学专业毕业生的自我评价
2013/11/29 职场文书
春节活动策划方案
2014/01/24 职场文书
初中语文教学反思
2014/02/02 职场文书
小学生操行评语大全
2014/04/22 职场文书
长城英文导游词
2015/01/30 职场文书
2015年路政工作总结
2015/05/22 职场文书
任长霞观后感
2015/06/16 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android