从LIKE'%keyword%'到倒排索引

1,588 阅读2分钟

一.  LIKE'%keyword%'的不足

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

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

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

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

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

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


二. ElasticSearch倒排索引

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


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


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

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


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


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


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