深度解析MySQL 5.7之中文全文检索
前言
其实全文检索在MySQL里面很早就支持了,只不过一直以来只支持英文。缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词。这不,从MySQL 5.7开始,MySQL内置了ngram全文检索插件,用来支持中文分词,并且对MyISAM和InnoDB引擎有效。
在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小,比如,
[mysqld] ngram_token_size=2
这里把分词大小设置为2。要记住,分词的SIZE越大,索引的体积就越大,所以要根据自身情况来设置合适的大小。
示例表结构:
CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, titleVARCHAR(200), body TEXT, FULLTEXT (title,body) WITH PARSER ngram ) ENGINE=InnoDBCHARACTER SET utf8mb4;
示例数据,有6行记录。
mysql> select * from articles\G ***************************1. row *************************** id: 1 title: 数据库管理 body: 在本教程中我将向你展示如何管理数据库 ***************************2. row *************************** id: 2 title: 数据库应用开发 body: 学习开发数据库应用程序 ***************************3. row *************************** id: 3 title: MySQL完全手册 body: 学习MySQL的一切 ***************************4. row *************************** id: 4 title: 数据库与事务处理 body: 系统的学习数据库的事务概论 ***************************5. row *************************** id: 5 title: NoSQL精髓 body: 学习了解各种非结构化数据库 ***************************6. row *************************** id: 6 title: SQL 语言详解 body: 详细了解如果使用各种SQL 6 rows inset (0.00 sec)
显式指定全文检索表源
mysql> SETGLOBAL innodb_ft_aux_table="new_feature/articles"; Query OK, 0 rows affected (0.00 sec)
通过系统表,就可以查看到底是怎么划分articles里的数据。
mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10; +------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID| POSITION | +------+--------------+-------------+-----------+--------+----------+ | 中我 | 2 | 2 | 1 | 2 | 28 | | 习m | 4 | 4 | 1 | 4 | 21 | | 习了 | 6 | 6 | 1 | 6 | 16 | | 习开 | 3 | 3 | 1 | 3 | 25 | | 习数 | 5 | 5 | 1 | 5 | 37 | | 了解 | 6 | 7 | 2 | 6 | 19 | | 了解 | 6 | 7 | 2 | 7 | 23 | | 事务 | 5 | 5 | 1 | 5 | 12 | | 事务 | 5 | 5 | 1 | 5 | 40 | | 何管 | 2 | 2 | 1 | 2 | 52 | +------+--------------+-------------+-----------+--------+----------+ 10 rows in set (0.00 sec)
这里可以看到,把分词长度设置为2,所有的数据都只有两个一组。上面数据还包含了行的位置,ID等等信息。
接下来,我来进行一系列检索示范,使用方法和原来英文检索一致。
一、自然语言模式下检索:
1、得到符合条件的个数,
mysql>SELECT COUNT(*) FROM articles -> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE); +----------+ | COUNT(*) | +----------+ | 4 | +----------+ 1 row in set (0.05 sec)
2、得到匹配的比率,
mysql>SELECT id, MATCH (title,body) AGAINST ('数据库' IN NATURAL LANGUAGE MODE) AS score FROM articles; +----+----------------------+ | id| score | +----+----------------------+ | 1 | 0.12403252720832825 | | 2 | 0.12403252720832825 | | 3 | 0 | | 4 | 0.12403252720832825 | | 5 | 0.062016263604164124| | 6 | 0 | +----+----------------------+ 6rows in set (0.00 sec)
二、布尔模式下搜索,这个就相对于自然模式搜索来的复杂些:
1、匹配既有管理又有数据库的记录,
mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+数据库 +管理' IN BOOLEAN MODE); +----+------------+--------------------------------------+ | id| title | body | +----+------------+--------------------------------------+ | 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库 | +----+------------+--------------------------------------+ 1 rowin set (0.00 sec)
2、匹配有数据库,但是没有管理的记录,
mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+数据库 -管理' IN BOOLEAN MODE); +----+------------------+----------------------------+ | id| title | body | +----+------------------+----------------------------+ | 2 | 数据库应用开发 | 学习开发数据库应用程序 | | 4 | 数据库与事务处理 | 系统的学习数据库的事务概论 | | 5 | NoSQL 精髓 | 学习了解各种非结构化数据库 | +----+------------------+----------------------------+ 3 rows in set (0.00 sec)
3、匹配MySQL,但是把数据库的相关性降低,
mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('>数据库 +MySQL' INBOOLEAN MODE); +----+---------------+-----------------+ | id| title | body | +----+---------------+-----------------+ | 3 | MySQL完全手册 |学习MySQL的一切 | +----+---------------+-----------------+ 1 rowin set (0.00 sec)
三、查询扩展模式,比如要搜索数据库,那么MySQL,oracle,DB2也都将会被搜索到,
mysql> SELECT * FROM articles -> WHERE MATCH (title,body) -> AGAINST ('数据库' WITH QUERY EXPANSION); +----+------------------+--------------------------------------+ | id| title | body | +----+------------------+--------------------------------------+ | 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库 | | 4 | 数据库与事务处理 | 系统的学习数据库的事务概论 | | 2 | 数据库应用开发 | 学习开发数据库应用程序 | | 5 | NoSQL 精髓 | 学习了解各种非结构化数据库 | | 6 | SQL 语言详解 | 详细了解如果使用各种SQL | | 3 | MySQL完全手册 | 学习MySQL的一切 | +----+------------------+--------------------------------------+ 6 rows in set (0.01 sec)
当然,我这里只是功能演示,更多的性能测试,大家有兴趣可以进行详细测试。由于N-grm是中文检索常用的分词算法,已经在互联网大量使用,这次集成到MySQL中,想必效果上不会有太大的问题。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
相关文章
- 这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
- 新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
深入研究mysql中的varchar和limit(容易被忽略的知识)
为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15- 这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
- 我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
- 宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
- 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
- 首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
- MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
- 一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
- Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
- 这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
- 这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-25
- 一、准备编译环境,安装所需依赖包yum groupinstall 'Development' -y yum install openssl openssl-devel zlib zlib-devel -y yum install readline-devel pcre-devel ncurses-devel bison-devel cmake -y二、编译安...2015-10-21
Mysql中 show table status 获取表信息的方法
这篇文章主要介绍了Mysql中 show table status 获取表信息的方法的相关资料,需要的朋友可以参考下...2016-03-12- 这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
- 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关...2013-09-11
- 这篇文章主要介绍了Delphi远程连接Mysql的实现方法,需要的朋友可以参考下...2020-06-30