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对于模糊查询like的一些汇总
May 09 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
mysql函数全面总结
Nov 11 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
MySQL表锁、行锁、排它锁及共享锁的使用详解
navicat 连接Ubuntu虚拟机的mysql的操作方法
MySQL中IO问题的深入分析与优化
mysql的Buffer Pool存储及原理
You might like
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php中rename函数用法分析
2014/11/15 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
用javascript实现页面打印的三种方法
2007/03/05 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
angular.bind使用心得
2015/10/26 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
python的id()函数介绍
2013/02/10 Python
python实现k-means聚类算法
2018/02/23 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
介绍一下如何优化MySql
2016/12/20 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
激励口号大全
2014/06/17 职场文书
死亡赔偿协议书
2015/01/28 职场文书
跑出一片天观后感
2015/06/08 职场文书
郭明义电影观后感
2015/06/08 职场文书
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL