什么是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一样可以查询
GET /like/_doc/_search
GET /like/_search