前言

其实全文检索在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之中文全文检索相关推荐

  1. mysql 5.7临时表空间_深度解析MySQL 5.7之临时表空间

    临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在 ...

  2. 深度解析mysql登录原理

    使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...

  3. 比MySQL快6倍 深度解析国内首个云原生数据库POLARDB的“王者荣耀”

    随着移动互联网.电子商务的高速发展,被使用最多的企业级开源数据系统MySQL面临着巨大挑战--为迎接"双11"的高并发要提前做好分库分表;用户不断激增要将读写分离才能应对每天上亿次 ...

  4. mysql replication 协议_深入解析MySQL replication协议

    WHY 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...

  5. mysql 二进制 存储格式化_解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 参考源: 1.源码log_event.h log_event.cc ...

  6. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  7. mysql not in 转化_解析MySQL隐式转换问题

    一.问题描述 root@mysqldb 22:12: [xucl]> show create table t1G *************************** 1. row ***** ...

  8. mysql源码如何解析where字句_用mysql源码进行SQL解析

    用mysql源码进行SQL解析 Mysql是通过yacc进行SQL语句解析的,这里介绍一下如何使用mysql的源码进行SQL语句解析.由于Mysql的源代码注释比较少,而且缺少资料,所有些地方研究不够 ...

  9. mysql5.7空间运算,深度解析MySQL5.7之临时表空间

    临时表 临时表顾名思义,就是临时的,用完销毁掉的表. 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上. 临时表有下面几种: 1.全局临时表 这种临时表从数据库实例启动后开始生效,在 ...

最新文章

  1. 装修(十三天,面板又换错了,大理石空鼓)
  2. Element Select多选选中项溢出选项框
  3. 《命犯桃花》离斯蒂芬·金还很遥远
  4. 特征工程系列学习(一)简单数字的奇淫技巧
  5. 【报告分享】人工智能2020:落地挑战与应对.pdf(附下载链接)
  6. 中国移动:部分 5G 手机可能有网连不上;iOS 13 出现严重漏洞;ReactOS 0.4.12发布 | 极客头条​...
  7. 利用深度学习识别番茄早期植株中的塔图绝对菌
  8. 苹果mac文本处理软件:FSNotes
  9. 脱不花,如何成为高效学习的人
  10. mysql 拼音排序_mysql汉字字段按拼音排序的方法
  11. 超越QQ Mail文件中转站---大文件上传设计思路和实践 原创 王泽宾
  12. 计算机实验室安全管理责任书,实验室安全管理责任书
  13. linux使用tar命令,Linux的tar命令使用简介
  14. java从入门到放弃教程(一) 想转行的看过来
  15. IOS开发之-人脸识别
  16. 机器学习算法原理与实践(二)、meanshift算法图解以及在图像聚类、目标跟踪中的应用
  17. http禁用缓存、文件下载
  18. nRF51 SDK 例程分析——Blinky Example
  19. 学习笔记1——常用的注意力机制(即插即用)
  20. c++最近公共祖先LCA(倍增算法和tarjan)

热门文章

  1. Java中栈,堆,常量池的简单理解
  2. base64 convert to file
  3. Linux中Shell重定向
  4. Go 网络 TCP Client (一)
  5. SCP使用技巧-递归排除文件
  6. 苹果电脑如何读写ntfs格式磁盘
  7. 为什么mvc里面的ModelState.IsValid一只都是true
  8. centos6.4 32位 详细安装Nginx
  9. 我儿子竟跟男孩子抱在一起
  10. 18.案例实战:体验lombok的核心@Data和@Slf4j注解