mysql 5.7 刘,深度解析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 5.7 刘,深度解析MySQL 5.7之中文全文检索相关推荐
- mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间
临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在 ...
- 深度解析mysql登录原理
使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...
- 比MySQL快6倍 深度解析国内首个云原生数据库POLARDB的“王者荣耀”
随着移动互联网.电子商务的高速发展,被使用最多的企业级开源数据系统MySQL面临着巨大挑战--为迎接"双11"的高并发要提前做好分库分表;用户不断激增要将读写分离才能应对每天上亿次 ...
- mysql replication 协议_深入解析MySQL replication协议
WHY 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...
- mysql 二进制 存储格式化_解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT
原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 参考源: 1.源码log_event.h log_event.cc ...
- java mysql 多表查询_解析Mysql多表查询的实现
查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...
- mysql not in 转化_解析MySQL隐式转换问题
一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1G *************************** 1. row ***** ...
- mysql源码如何解析where字句_用mysql源码进行SQL解析
用mysql源码进行SQL解析 Mysql是通过yacc进行SQL语句解析的,这里介绍一下如何使用mysql的源码进行SQL语句解析.由于Mysql的源代码注释比较少,而且缺少资料,所有些地方研究不够 ...
- mysql5.7空间运算,深度解析MySQL5.7之临时表空间
临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在 ...
最新文章
- 装修(十三天,面板又换错了,大理石空鼓)
- Element Select多选选中项溢出选项框
- 《命犯桃花》离斯蒂芬·金还很遥远
- 特征工程系列学习(一)简单数字的奇淫技巧
- 【报告分享】人工智能2020:落地挑战与应对.pdf(附下载链接)
- 中国移动:部分 5G 手机可能有网连不上;iOS 13 出现严重漏洞;ReactOS 0.4.12发布 | 极客头条​...
- 利用深度学习识别番茄早期植株中的塔图绝对菌
- 苹果mac文本处理软件:FSNotes
- 脱不花,如何成为高效学习的人
- mysql 拼音排序_mysql汉字字段按拼音排序的方法
- 超越QQ Mail文件中转站---大文件上传设计思路和实践 原创 王泽宾
- 计算机实验室安全管理责任书,实验室安全管理责任书
- linux使用tar命令,Linux的tar命令使用简介
- java从入门到放弃教程(一) 想转行的看过来
- IOS开发之-人脸识别
- 机器学习算法原理与实践(二)、meanshift算法图解以及在图像聚类、目标跟踪中的应用
- http禁用缓存、文件下载
- nRF51 SDK 例程分析——Blinky Example
- 学习笔记1——常用的注意力机制(即插即用)
- c++最近公共祖先LCA(倍增算法和tarjan)