elasticsearch 倒排索引原理详解

发布时间:2022-02-23 21:41:06 作者:路人甲 阅读(1066)

什么是es

elasticsearch 是面向文档型的nosql数据库,一条数据就是一个文档;因为es的出现就是为了搜索而生的,所以es的核心就是索引,甚至说es中 “==一切皆索引==” 都不为过;最核心的概念就是“==倒排索引==”;

什么是倒排索引

有倒排就肯定有正排;所以在了解倒排索引之前,先来了解一下什么是正排索引,通过这2种索引的比较会更容易理解es的核心概念;

正排索引(正向索引)

相信大家都学过关系型数据库,像mysql、oracle、sqlserver等等;这些关系型数据库在查询数据时都是使用正排索引的,比如下面表数据中,如果我们要查询某一条记录,只需要通过主键id来关联到整行数据即可,这种通过主键id来关联整行数据的方式就叫做正排索引

但是,现在有一个需求,我要找friends中有李四的记录,就得用模糊查询来实现,而众所周知,模糊查询的效率是非常低下的,因为模糊查询涉及到全表扫描,如果你的表数据中有上千万的数据,这种查询方式无疑会消耗大量的时间;

倒排索引

而反向索引则是将关键字作为索引去查询,在底层会将一段内容拆开,分成一个个关键字,每个关键子对应了哪个主键id,有了这层关联之后,查询的速度自然快了许多;

分词

把一段文字拆开分成不同的词语,这是怎么做到的呢?这就要说到es一个很重要的功能那就是分词器,但是es默认只支持英文分词,不支持中文,若要使用中文分词,需要自行安装IK分词插件;

es和关系型数据库存储数据的概念对比

es的存储结构其实和关系型数据库差不多,只是有一些名词会有差异化,他们的区别如下

关系型数据库 Elasticsearch
数据库(database) 索引(indices)
表(tables) (类型)types
行(rows) documents(文档)
字段(columns) fields(属性)
去掉Types

这里的Types已经被逐渐弱化,在es6中,一个index下只能包含一个type,而在es7中,types的概念已经被删除,如果我们在一个index下创建2个types的话会报错;

es7以后,以下2个查询的结果是一样的,去掉了types一样可以查询

  1. GET /like/_doc/_search
  2. GET /like/_search

关键字数据库