正文
ES核心概念
概述
在前两更中已经讲了es是什么,如何安装和启动,那么es到底是怎么去存储数据的呢?又是如何搜索的效率如此之高呢?带着问题来学习!
集群、节点、索引、类型、分片、映射到底是什么?
首先了解es和关系型数据库的对比!JSON!
DB | ES |
数据库(database) | 索引(indices) |
表(tables) | types |
行(row) | documents |
字段(rows) | fields |
上述分析
索引(indices):相当于db中的数据库
types:相当于DB中的表但是7.X版本后会被慢慢弃用8.X将彻底弃用!这里做个了解即可
documents:相当于DB中的行也就是数据
fields:相当于DB中的字段 这很好理解 在ES中作用相似 是documents的字段(例如 id,name,age)
es集群概念
es后台把每个索引都分为多个分片,每个分片在不同的服务器上迁移
所以es启动就是一个集群!因为默认开启就会进行分片,只是如果只搭了一台服务器看不出来而已!
什么是分布式,启动就是集群!
在浏览器输入:http://127.0.0.1:9200
什么是 索引,文档,类型
索引:因为es全部都是json格式存储的,可以把索引理解为一个非常大的集合,而集合内装的每一个对象则是documents文档,文档中则是使用很多不同类型的feilds存储的!然后被存入各个分片上。
文档:在一更中说过 es是面向文档的!那就意味着文档是索引和搜索的最小单位!文档有几个重要的属性。
- 自我包含,一个文档同时包含字段和对应的值,也就是同时包含key,value 例如我要搜索name=zhangsan的数据,那么就能把对应的value获取出来。
- 层次型,一个文档里可以包含自我文档,复杂的逻辑实体就是这么来的!{就是一个json,到后面使用springboot测试的时候可以使用fastjson,它能够帮助我们自动生成索引!}
- 灵活的结构,我们都知道在关系型数据库中的表结构必须预定设置类型,而使用es操作文档时则是非常灵活的,有时候我们可以忽略某个字段或者动态的新增一个新字段!可以理解为 文档就是一条条的数据!
类型:在文档中是可以像关系型数据库一样设置类型的,例如DB中的varchar->对应es string,keyword,DB中date->es date 等等!使用es时最安全的方式就是预先设置字段类型,这就跟关系型数据库有点殊途同归了, 另外如果在一个文档中没有设置类型 那么es则会自动识别注入类型(有几率与我们预想的类型不同)。
节点和分片
一个集群至少有一个节点,而这个节点就是我们的elasticSerach进程,节点可以由多个索引默认的,如果创建索引那么将会有默认五个分片(primary shard,又称主分片)构成的,每一个分片将会有一个副本(replica shard,又称复制分片)用白话说就是 我们创建的索引不止有一个地方可以存 默认存了五分 我们可以通过分片把他们搭在不同的集群上(索引的默认分片数量可以在kinbana中设置模板引擎自定义数量)
上图是一个有三个节点的集群,可以看到三个主分片和对应的复制分片都不会在同一个节点上,这样有利于当某个节点挂了,数据也不会丢失。
实际上一个分片就是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使es不用全盘扫描全部文档的情况下就能告诉你哪些文档包含特定的关键字,等等!!!!倒排索引是个什么鬼?????
然而倒排索引是es的重中之重,搜索为何如此之快的关键所在!!!