一、前言

最近有项目需要使用mysql进行全文检索,由于之前都是使用的Elasticsearch数据库进行数据检索,因此查询了相关资料后,了解了mysql如何使用全文索引。

二、ngram全文分析器

1.什么是ngram

ngram是全文解析器能够对文本进行分词,中文分词用 ngram_token_size 设定分词的大小,ngram_token_size 的值就是连续n个字的序列
示例:使用ngram对于‘全文索引进行分词’

ngram_token_size =1,分词为 ‘全‘,’文‘,’索‘,’引‘
ngram_token_size =2,分词为 ‘全文‘,’文索‘,’索引‘
ngram_token_size =3,分词为 ‘全文索‘,’文索引‘
ngram_token_size =4,分词为 ‘全文索引‘

2.如何查看配置ngram_token_size

#查看默认分词大小 ngram_token_size=2
show variables like '%token%';

查询结果:

innodb_ft_min_token_size
默认3,表示最小3个字符作为一个关键词,增大该值可减少全文索引的大小
innodb_ft_max_token_size
默认84,表示最大84个字符作为一个关键词,限制该值可减少全文索引的大小
ngram_token_size
默认2,表示2个字符作为内置分词解析器的一个关键词,如对“abcd”建立全文索引,关键词为’ab’,‘bc’,‘cd’
当使用ngram分词解析器时,innodb_ft_min_token_size和innodb_ft_max_token_size 无效

3.修改配置ngram_token_size

第一种
mysqld --ngram_token_size=1
第二种
在配置文件中[mysqld]ngram_token_size=1
这三个参数均不可动态修改,修改后需重启MySQL服务,并重新建立全文索引
== 建议使用默认分词大小==

三、全文索引

MySQL 5.6版本以前只有MyISAM存储引擎支持全文引擎,在5.6版本中,InnoDB支持对全文索引的.5.7.6版本,MySQL内置了ngram全文解析器,同时支持中文全文的分词。
因此需要支持全文检索需要大于5.76版本

创建全文索引

1、创建表的同时创建全文索引

CREATE TABLE full_search_test(id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR (200),author VARCHAR (200),content TEXT,# 建立全文索引,同时使用ngram全文分析器FULLTEXT (title) WITH PARSER ngram
) ENGINE = INNODB;

2、通过 alter table 的方式来添加

ALTER TABLE full_search_test ADD FULLTEXT INDEX full_index_title(title) WITH PARSER ngram;

3、直接通过create index的方式

#为title创建全文索引并且使用ngram全文解析器进行分词
CREATE FULLTEXT INDEX full_index_title ON full_search_test(title) WITH PARSER `ngram`;

四、检索测试

测试环境搭建

数据库脚本

CREATE TABLE `full_search_test` (`id` int unsigned NOT NULL AUTO_INCREMENT,`author` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,`title` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL,`content` text COLLATE utf8mb4_general_ci,PRIMARY KEY (`id`),FULLTEXT KEY `full_index_title` (`title`) WITH PARSER `ngram`
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

测试数据:

INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (1, '小孩子4919', 'MySQL 是怎样运行的 test', '《MySQL是怎样运行的:从根儿上理解 MySQL》采用诙谐幽默的表达方式,对 MySQL 的底层运行原理进行了介绍,内容涵盖了使用MySQL的同学在求职面试和工作中常见的一些核心概...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (2, '施瓦茨 (Baron Schwartz) / 宁海元', '高性能MySQL (第3版)  术内', '《高性能mysql(第3版)》是mysql 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了最新mysql 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (3, '[日]西泽梦路 / 卢克贵 ', 'MySQL 基础教程 内幕', '1.本书是日本公认的MySQL入门首选教程,原版长销13年,好评如潮,本书是第3次改版 2.本书有丰富的插图和示例程序,即使是初学者,也很容易理解和掌握相关知识点 3.本书...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (4, '小孩子4919 ', '技术MySQL 是怎样使用的 快速入门 MySQL', '《MySQL是怎样使用的:快速入门MySQL》采用通俗易懂的表达方式,对如何使用MySQL进行了详细的介绍。《MySQL是怎样使用的:快速入门MySQL》完全从零基础用户的角度出发,...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (5, '[英] Ben Forta / 刘晓霞', 'MySQL 必知必会 内幕', '《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (6, '姜承尧', 'MySQL 技术内幕', '《MySQL技术内幕:InnoDB存储引擎(第2版)》由国内资深MySQL专家亲自执笔,国内外多位数据库专家联袂推荐。作为国内唯一一本关于InnoDB的专著,《MySQL技术内幕:InnoDB存...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (7, '[英] Ben Forta / 刘晓霞', 'MySQL 必知必会 测试', '《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全...');
INSERT INTO `platform`.`full_search_test`(`id`, `author`, `title`, `content`) VALUES (8, '刘晓霞', '高性能必知必会', '《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全...');

全文检索模式

1. 自然语言模式(NATURAL LANGUAGE MODE)

不指定检索模式

#ngram默认配置为2,因此'技术内幕'会被分词解析器解析为 '技术','术内','内幕'
#score表示相关性评分
select *,(MATCH ( `title`  ) AGAINST ( '技术内幕' )  )AS score
from full_search_test
where MATCH(title) AGAINST('技术内幕' ) ;


自然语言模式(NATURAL LANGUAGE MODE)

select *,(MATCH ( `title`  ) AGAINST ( '技术内幕' )  )AS score
from full_search_test
where MATCH(title) AGAINST('技术内幕' in NATURAL LANGUAGE MODE );


== 执行结果可以看出 自然语言模式是MySQL 默认的全文检索模式 ==

2. BOOLEAN模式(BOOLEAN MODE)

BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。


# '内幕 技术' 无操作符,表示或
select *
from full_search_test
where MATCH(title) AGAINST('内幕 技术' IN BOOLEAN MODE);


可以看到由于同时包含’内幕 技术’,因此第一个记录的相关性评分更高


# '+内幕 +技术' 必须同时包含两个词
select *  ,(MATCH ( `title`  ) AGAINST ( '内幕 技术' )  )AS score
from full_search_test
where MATCH(title) AGAINST('+内幕 +技术' IN BOOLEAN MODE) order by score Desc;


# '+内幕 -技术' 必须包含内幕,但是不包含技术
select *
from full_search_test
where MATCH(title) AGAINST('+内幕 -技术' IN BOOLEAN MODE);


# '+MySQL ~技术' 必须包含MySQL,但是如果包含技术,相关性比不包含技术的记录高
select * ,(MATCH ( `title`  ) AGAINST ( '+MySQL ~技术' IN BOOLEAN MODE)  )AS score
from full_search_test
where MATCH(title) AGAINST('+MySQL ~技术' IN BOOLEAN MODE) order by score Desc;


# '+MySQL +(>基础 <必知)' 必须包含MySQL,或者包含基础和必知,'MySQL 基础'相关性评分高于'MySQL 必知'
select * ,(MATCH ( `title`  ) AGAINST ( '+MySQL +(>基础 <必知)' )  )AS score
from full_search_test
where MATCH(title) AGAINST('+MySQL +(>基础 <必知)' IN BOOLEAN MODE) order by score Desc;


# 查询包含高性能开头的记录
select * ,(MATCH ( `title`  ) AGAINST ( '高性能*' )  )AS score
from full_search_test
where MATCH(title) AGAINST('高性能*' IN BOOLEAN MODE) order by score Desc;


# 使用双引号把要搜素的词括起来,效果类似于like '%高性能%'
select * ,(MATCH ( `title`  ) AGAINST ( '"高性能"' )  )AS score
from full_search_test
where MATCH(title) AGAINST('"高性能"' IN BOOLEAN MODE) order by score Desc;

MySQL使用全文索引+ngram全文解析器进行全文检索相关推荐

  1. mysql ngram_MySQL ngram全文解析器

    本教程将向您展示如何使用MySQL ngram全文解析器来支持中文,日文,韩文等表意语言的全文搜索. MySQL ngram全文解析器简介 MySQL内置的全文解析器使用空格确定单词的开始和结束.当涉 ...

  2. mysql 解析器_MySQL ngram全文解析器

    本教程将向您展示如何使用MySQL ngram全文解析器来支持中文,日文,韩文等表意语言的全文搜索. MySQL ngram全文解析器简介 MySQL内置的全文解析器使用空格确定单词的开始和结束.当涉 ...

  3. 【MySQL全文检索教程2】中文语义分词检索,配置ngram解析器ngram_token_size,innodb_ft_min_token_size,innodb_ft_min_token_size

    MySQL全文索引:中文语义分词检索(相似度匹配) 原文链接:https://blog.csdn.net/qq_39702981/article/details/125141024 通常情况下,全文检 ...

  4. MySQL索引机制(详细+原理+解析)

    MySQL索引机制 永远年轻,永远热泪盈眶 一.索引的类型与常见的操作 前缀索引 MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度.但是前缀索引也有它的坏处:MySQL 不能在 ORDER ...

  5. MySql的全文索引FULLTEXT(Mysql8.0版本)

    全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术.它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果. 全文索引始终发生 ...

  6. ngram mysql_mysql8 参考手册--ngram全文分析器

    内置的MySQL全文语法分析器使用单词之间的空白作为定界符来确定单词的开始和结束位置,这在使用不使用单词定界符的表意语言时是一个限制.为了解决此限制,MySQL提供了一个支持中文,日语和朝鲜语(CJK ...

  7. mysql源码如何解析where字句_MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)...

    背景 一个最简单的select语句包含select子句.from子句.where子句等,这些子句都不包含子查询(subselect),也没有union操作.而复杂的select语句包含select子句 ...

  8. MySQL内核源码解读-SQL解析之解析器浅析

    MYSQL服务器接收SQL格式的查询,首先要对sql进行解析,内部将文本格式转换为二进制结构,这个转换就是解析器,解析的目的是为了让优化器更好的处理指令,以便以最优的路径,最少的耗时返回我们想要的结果 ...

  9. mysql ddl 语法解析工具_sharding-sphere之语法解析器

    语法解析器,根据不同类型的语句有不同的语法解析器去解析成成SQLStatement,SQL解析器的类图我用脑图画出来如下: SQLParser.png 可以看到,不同的sql有不同的处理解析器去解析, ...

最新文章

  1. HttpClient 连接池设置引发的一次雪崩!
  2. LAMP+Postfix+Dovecot+Postfixadmin搭建邮件管理系统(六)
  3. ETC公布2018线路图,试图追赶ETH
  4. linux串口拼接,Linux下串口操作之數據拼接
  5. android activity根节点addview_Activity问你4个问题,你敢回答吗?
  6. 文本深度表示模型Word2Vec
  7. nik collection滤镜
  8. 轻松实现远程批量拷贝文件脚本(女学生作品)
  9. BootLoader引导程序制作及移植(二)
  10. nginx编译安装,nginx静态资源访问和负载均衡的使用!
  11. uboot 命令使用
  12. 数据分析学习笔记—python函数、异常与处理
  13. Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书
  14. 如何在EDUIS中导出ETL字幕模板_给视频加字幕?这8个工具助力你的短视频创作!...
  15. excel添加水印及设置打印参数poi
  16. 创建AWS VPC Peering
  17. 奥城大学计算机专业,研究生美国留学双录取院校汇总
  18. 智慧医院新系统架构设计与建设
  19. 【一】MADDPG-单智能体|多智能体总结(理论、算法)
  20. 年轻程序员如何快速成长

热门文章

  1. 内存中数据的存储和单位换算
  2. 快速傅里叶变换(FFT),离散傅里叶变换(DFT)
  3. uni-app h5微信浏览器 预览和下载pdf
  4. 为别人做嫁衣裳——代理模式
  5. 通过了解RejectedExecutionException来分析ThreadPoolExecutor源码
  6. linux方法有哪些,Linux 进程有哪些方法?这4种方法轻松易学
  7. Thinkpad X270 加m2 NVME 固态硬盘
  8. 微信公众号如何实现模板消息发送的功能
  9. 计算机图形学 实验8 《复杂图形绘制-Bezier曲面及其纹理》
  10. uni-app视频播放及下载功能