mysql like 索引_从LIKE'%keyword%'到倒排索引

一. LIKE'%keyword%'的不足

我们在做项目的时候经常有模糊查询这个需求,比如下面这种:

9692d303e0ef7fe964f5bb76195ae728.png

一般对于这种需求,为了提高查询效率,我们会在keyword所在的列中建一个索引,但是在mysql中对于模糊匹配LIKE有些情况下索引会失效:

对于LIKE '%keyword%'这种情况下索引会失效;

对于LIKE 'keyword%'这种情况下索引不会失效;

问题就出在LIKE '%keyword%',很多需求都是要这种的,像我做过的项目中模糊匹配都要前后两边加"%"来匹配,需求和测试可不管你索引有没有失效。

af9e38113b26f7c9ce0d84da61a915b7.png

而且这种模糊匹配还不智能,keyword里面出现了空格是找不到是匹配不到数据的:

a7d8e2dc3dabfba0eb6bb9db1d6b7538.png
150b77f3bdf59f5f34ecde4f6b3ce929.png
50ffb3d9e56f5f58945990c347b213b2.png
4f884869e75810dfa0585318e290f85a.png

二. ElasticSearch倒排索引

如果需求规定死了模糊匹配要两边加"%"匹配,这时候我们就要考虑用专业的搜索引擎ElasticSearch来实现我们的需求了,ElasticSearch分为索引、类型、文档,跟mysql对比的话,索引就相当于数据库,类型就相当于数据表,文档就相当于表中一条条数据。

f7bab7673822773c7777fa82f8ca8794.png

ElasticSearch搜索引擎的核心是建立倒排索引,什么是倒排索引呢?倒排索引就是以字段中的分词来作为索引的,像“今天是立冬”这句话,我们就可以把“今天”、”立冬"作为索引(“是”这种一般不建立索引),

8e13c1378e8fcc77536b71f4ab301ec1.png

这种倒排索引的建立比传统的数据库的正向索引效率要快很多,举个例子就知道了:

假设数据表有两个字段id,message,数据有100000条,我要在message字段中匹配“广东”这个词:

ee66a0b4d258e47834ffc066a325b7be.png

传统的正向索引是先找到message字段的数据,在看看message字段中的数据有没有“广东”这个词,有就查询出来,也就是说要从100000条数据里面一条条匹配,效率会很低下。

f2ac3d98b3f673253eac6ea17c94ef19.png

到了ElasticSearch中直接以“广东”作为索引,索引后面直接把符合条件的文档记录下来,到时候查找有“广东”字段的文档时直接根据索引就能找到全部符合条件的来,效率大大提高了。

c92244de7155021d45717832acc60b73.png

倒排索引的应用是很广泛的,像京东,大众点评这些app里的搜索都是基于倒排索引实现的,下面的文章我将一步步讲解ElasticSearch其他方面的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值