MySQL5.7在中文全文检索中的深度分析

前言

事实上,全文检索提供了早期的MySQL,但只有英语。原因是,他总是用空间作为分词的分离器,和中国,显然,使用空格是不合适的。不,因为MySQL 5.7,MySQL有一个内置的Ngram全文检索插件支持中文分词是有效的,MyISAM和InnoDB引擎。

在使用中文分词插件,NGram,你要在MySQL的配置文件中的设置了分词的大小,例如,


{他}
ngram_token_size = 2


在这里,分词的大小设置为2。记住,单词的大小越大,索引的体积就越大,所以根据自己的情况设置合适的大小。

样本表结构:


创建表(文章)
我intunsigned auto_increment无效的主键,
(200)titlevarchar,
正文,
全文(标题、主体)与PARSER NGram
发动机= innodbcharacter集utf8mb4);


样本数据,有6行记录。


从文章选择*
*************************** 1。行***************************
编号:1
标题:数据库管理
正文:在本教程中,我将向您展示如何管理数据库。
*************************** 2。row ***************************
编号:2
标题数据库的应用与发展
主体:学习开发数据库应用程序
*************************** 3。行***************************
编号:3
标题:mysql完全手册
身体:学习有关MySQL的一切
*************************** 4。行***************************
编号:4
标题:数据库和事务处理
人体学习数据库事务的介绍:系统
*************************** 5。行***************************
编号:5
标题:NoSQL的本质
学习如何理解各种非结构化数据库
*************************** 6。行***************************
编号:6
标题的详细解释:SQL语言
正文:对各种sql的使用有详细的了解。
6行插入(0秒)


显式指定全文检索表源


MySQL > setGlobal innodb_ft_aux_table =new_feature /文章;
查询OK,0行受影响(0秒)


通过系统表,您可以看到文章中的数据是如何划分的。


MySQL >选择*从information_schema.innodb_ft_index_cache限制20,10;
+ + + + ------ -------------- ------------- ----------- -------- ---------- + + +
|字| first_doc_id last_doc_id doc_count doc_id |位置| | | |
+ + + + ------ -------------- ------------- ----------- -------- ---------- + + +
我| | 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行(0秒)


正如你所看到的,分词的长度设置为2,所有的数据只有两个。上面的数据还包含了行的位置、id等。



接下来,我将使用这个方法和原始的英文检索来进行一系列的搜索和演示。

第一,自然语言模型中的检索:



1。得到符合条件的号码。




从文章中选择计数(*)
在匹配(标题、主体)对(在数据库自然语言模式);
---------- + +
|计数(*)|
---------- + +
4 | |
---------- + +
1行集(0.05秒)


2。得到匹配率,




MySQL >选择ID匹配(标题、主体)对('database '自然语言模式)
从文章中评分;
+——+ ---------------------- +
我|评分| |
+——+ ---------------------- +
| 1 | 0.1240325272083282 |
| 2 | 0.1240325272083282 |
| 3 | 0 |
| 4 | 0.1240325272083282 |
| 5 | 0.062016263604164124 |
| 6 | 0 |
+——+ ---------------------- +
6rows设定(0秒)


二是在布尔模式下搜索,比自然模式搜索复杂得多:



1。具有管理和数据库的匹配记录。




从匹配(标题,正文)的文章中选择*
在布尔数据库管理模式下>(+ +);
+ -- + + + ------------ --------------------------------------
我|标题体| | |
+ -- + + + ------------ --------------------------------------
1 | |数据库管理|在本教程中,我将向你展示如何管理数据库|
+ -- + + + ------------ --------------------------------------
1行集(0秒)


2。匹配数据库,但不管理的记录。




从匹配(标题,正文)的文章中选择*
在布尔数据库管理模式下反对(> +);
+ -- + + + ------------------ ----------------------------
我|标题体| | |
+ -- + + + ------------------ ----------------------------
2 | |数据库应用开发|学习数据库应用开发|
4引言| | |交易数据库和事务处理系统|学习数据库
| 5 | NoSQL |本质学习各种非结构化数据库|
+ -- + + + ------------------ ----------------------------
3行(0秒)


3,匹配mysql,但减少数据库的相关性,




从匹配(标题,正文)的文章中选择*
对(+ mysql'inboolean - >>数据库模式);
+ -- + + + --------------- -----------------
我|标题体| | |
+ -- + + + --------------- -----------------
3 | | | MySQL完全手册|学习mysql
+ -- + + + --------------- -----------------
1行集(0秒)


三。查询扩展模式(如搜索数据库、MySQL、Oracle和DB2)都将被搜索,


从文章中选择*
-比赛(头衔,身体)
反对(带>数据库查询扩展);
+ -- + + + ------------------ --------------------------------------
我|标题体| | |
+ -- + + + ------------------ --------------------------------------
1 | |数据库管理|在本教程中,我将向你展示如何管理数据库|
4引言| | |交易数据库和事务处理系统|学习数据库
2 | |数据库应用开发|学习数据库应用开发|
| 5 | NoSQL |本质学习各种非结构化数据库|
6 | | SQL语言|详细了解如果使用不同的SQL |
3 | | | MySQL完全手册|学习mysql
+ -- + + + ------------------ --------------------------------------
6行(0.01秒)


当然,我只是一个演示功能,更多的性能测试,人们在详细测试有兴趣。因为n-grm是中文搜索常用的分割算法,它已被广泛应用于互联网。如果集成到MySQL中,就不会有大问题了。

总结

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,你可以留言。