前言

在我们日常开发中,很多时候会遇到对数据库中某个字段模糊查询的需求,也就是like某个字段,但是很多公司像阿里,京东都禁止使用like来对数据库进行模糊查询,原因是啥呢?
我们先来看下面三条语句

其中title添加了索引

1.SELECT id,title from test_user where title like '张三%'
2.SELECT id,title from test_user where title like '%张三'
3.SELECT id,title from test_user where title like '%张三%'

上面三条语句只有第一条可能走索引,是否走索引还要看MySQL查询时索引的选择性问题,如果表中有十万条数据,title中含有张三的数据只有几百条时,索引的选择性很好,MySQL就会使用title索引,如果十万条数据中有九万九千条数据的title含有张三,那这次查询的索引选择性会非常差,就会走全表扫描,效率极其低下。
第二条和是第三条语句是一定不会走索引的,因为MySQL的索引是按照从前到后依次排列的。

方案1

可能这时候会想到新增一个专门用来做全文检索的工具,比如ElasticSearch,利用阿里的Canal中间件来订阅MySQL的binlog,将MySQL中的数据同步到ElasticSearch,但是如果之前没用ElasticSearch,只是只是对短文本全文检索而去新增ElasticSearch,显然有点得不偿失而且会增加开发和运维的成本,而且像ElasticSearch这种数据库也一定要保证高可用,就需要最少三台来组成一个高可用集群,而且通过订阅binlog的方式,也会影响数据的一致性,需要在架构和编码的过程中新增很多需要考虑的因素,所以要尽量简单方便的情况下实现全文检索,使用ElasticSearch并不是一个最好的方案。

方案2

这时候我们可以考虑一下用MySql5.7.6之后新增的全文解析器Ngram
ngram全文解析器适合对短文本来进行全文检索,如果是长文本或者大数据量的话ElasticSearch仍然是不可或缺的。

ngram的使用特点

  1. 可以支持中文、日文、韩文分词
  2. 只有char、varchar、text类型字段能创建全文索引
  3. 英文分词用空格,逗号;中文分词用 ngram_token_size 设定

ngram的检索方式

自然语言模式(NATURAL LANGUAGE MODE)

自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询

BOOLEAN模式(BOOLEAN MODE)

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

BOOLEAN的关键字

1.'dog cat'
字段当中加一个空格,表示查询结果中包含dog或者cat
2.'+dog +cat'
字段前面加'+',表示必须同时包含dog和cat
3.'+dog cat'
表示必须包含dog,对cat并不强制,如果出现cat,则相关性会更高
4.'+dog -cat'
表示必须包含dog,必须不包含cat
5.'+dog ~cat'
表示必须包含dog,对cat并不强制,如果出现cat,则相关性会变低
6.'+dog +(>cat <pig)'
表示必须包含dog和cat或者包含dog和pig,但是dog cat的相关性比dog pig的相关性高
7.'dog*'
表示包含以dog开头的内容

ngram的使用方法

  1. 添加全文索引


2. 查询

// 不指定模式,默认使用自然语言模式
SELECT * FROM articles WHERE MATCH (title) AGAINST ('文言文');
//使用 boolean mode通配符模式。
select * from articles where match(title) AGAINST('cal*' in boolean mode);
使用Boolean中 cal*的方式,查询以cal*开头的内容

默认自然语言模式不需要指定查询模式,而使用Boolean模式时需要指定
in boolean mode

ngram的配置相关参数

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 无效

如何设置ngram_token_size

第一种

mysqld --ngram_token_size=1

第二种

在配置文件中[mysqld]ngram_token_size=1

这三个参数均不可动态修改,修改了这些参数,需重启MySQL服务,并重新建立全文索引!!

结尾

MySQL的ngram的使用方式粗略介绍完了,在需要全文检索的情况下还是要取舍,如果是大数据,大文档的全文检索,改用ElasticSearch还是要用,如果是短文本的全文检索,就可以考虑一下Ngram,还是要根据实际的使用情况来决定,毕竟架构设计还是在于取舍,而不是一股脑的将所有东西都加进去。

谢谢观看,请关注点赞,感谢支持。

MySql的Ngram全文索引相关推荐

  1. ngram mysql_MySQL数据库之MySQL 全文检索 ngram Mybatis

    本文主要向大家介绍了MySQL数据库之MySQL 全文检索 ngram Mybatis ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 创建全文索引(FullText index ...

  2. mysql text index_MySQL 全文索引(fulltext index)

    1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也 ...

  3. MySQL中的全文索引

    MySQL中的全文索引 全文索引(Fulltext index)主要用来查找文本中的关键字,而不是直接与索引中的值相比较.Fulltext索引跟其他索引大不相同,它更像是一个搜索引擎,而不是简单的w ...

  4. mysql ngram_MySQL ngram全文解析器

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

  5. mac mysql ngram_MySQL ngram

    MySQL ngram 简介:本教程向您展示如何使用MySQL ngram全文解析器来支持中文,日文,韩文等表意语言的全文搜索. MySQL ngram全文解析器简介 内置的MySQL全文解析器使用空 ...

  6. mysql Ngram 全文索引_MySQL 全文检索 ngram Mybatis

    创建全文索引(FullText index) 创建表的同时创建全文索引 FULLTEXT (name) WITH PARSER ngram 通过 alter table 的方式来添加 alter ta ...

  7. mysql 5.6 全文索引_MySql5.6全文索引 及 5.7 中文索引插件ngram

    MySql 5.6.4 之后开始支持 innodb 全文索引,之前版本只能使用MyISAM 直接开始: 创建一个表和索引 USE test; CREATE TABLE articles ( id IN ...

  8. Mysql 索引 n-gram分词引擎使用

    概述: 类似于书籍的目录,找到一本书的特定内容,需要首先找到内容对应页码,定位对应页码 存储引擎使用类似方法进行数据查找,先找到索引中对应值,然后根据匹配的索引找到对应行 实现原理: 索引的实现通常使 ...

  9. mysql fulltext like_MySQL全文索引 FULLTEXT索引和like的区别

    1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引.对于FULLTEXT索引的内容可以使用MATCH()-AGAIN ...

最新文章

  1. 什么是标记符控制的分水岭算法
  2. python response.json()报错_python:解析requests返回的response(json格式)说明
  3. Hybris (SAP旗下的软件公司)
  4. [我的1024开源程序]100元写的单词本说明书
  5. excel表格大学计算机知识,大学计算机基础excel电子表格
  6. Linux 线程池的概念与实现
  7. 计算机无法启动显示空格闪烁,我的电脑打不开怎么把硬盘格式化
  8. 《Linux编程》上机作业 ·002【Linux常用工具GCC、GDB、Make】
  9. SubSonic学习(二)
  10. 在Ubuntu18上使用fusedav挂载城通网盘webdav
  11. Linux欧姆单位怎么打,电阻常识-younger0-ChinaUnix博客
  12. 2.2 反相放大器、高输入电阻反相放大器、反相高压放大器
  13. 阿里云实践训练营第七天——Class6 NAS快速搭建个人网盘
  14. 如何制作一个高转化的广告落地页(文末有福利)
  15. 计算机为何用二进制而不用十进制,为什么计算机使用二进制而不是十进制?
  16. uniAPP 禁用原生导航栏 和 获取状态栏高度 和 使用(间距掉)
  17. D. Cloud of Hashtags
  18. html网址中的各个标签代表什么意思
  19. 这就是你要的廉价,廉价版iPhoneX到底便宜在哪?
  20. 上饶师范学院数学与计算机科学学院,第4章-上饶师范学院数学与计算机科学学院.doc...

热门文章

  1. 修改手机屏幕刷新率_什么是屏幕刷新率?高刷新率屏幕为手机带来什么
  2. 【Web】Monit监控程序使用
  3. VS2022-scanf返回值忽略报错解决方案
  4. 获取纯净版win10 iso 制作纯净版win10装机盘
  5. 深入浅出AOF功能和AOF重写两个知识点
  6. 湖北高校毕业生供需见面月首场招聘火爆开锣
  7. 数据大屏 - guandata智能数据可视化分析
  8. 微信小程序--(找回密码)
  9. 既然安卓免费,那 Google 是靠什么赚钱的?
  10. ZooKeeper Dynamic Reconfiguration(ZooKeeper 动态配置重构)