索引(indices)&类型(type)&文档(document)&字段(fields)
ElasticSearch数据存储的设计思想跟关系型数据库有很多相似之处,熟悉关系型数据库的同学可以按以下快速了解ElasticSearch:ElasticSearch(集群)中可以包含多个索引(数据库),单个数据库包含很多类型(表),单个类型包含很多文档(每行数据),单个文档包含很多字段(每个字段)。
关系型数据库(例如MySQL) | 非关系型数据库(例如ES) |
---|---|
数据库(database) | 索引(indics) |
表(table) | 类型(type) |
行(row) | 文档(document) |
列(column) | 字段(fields) |
约束(Schema) | 映射(mapping) |
索引
索引是Elastic最大的存储单元,也就是’数据库’。与关系型数据库不同的是ES可以直接往索引中写入文档,而不是往类型里写数据。关于类型官网明确说明是设计上的失误。
- 6.x版本,es规定只能一个索引只能有一个type
- 7.x版本默认使用_doc作为type
- 官方说在8.x版本会彻底移除type
为什么要移除typehttps://www.cnblogs.com/huangfox/p/9460361.html
类型
一个索引会有一个或多个类型,类型(表)是文档(数据行)的逻辑容器。同一个document下,fields是一致的。可以看到表格里提到了关系型数据库的约束与非关系型数据库的映射。mysql中都是先定义好字段类型才可以存数据,ES不需要提前定义数据类型,ES有动态映射的功能,他会去猜。虽然动态映射功能很强大,实际使用时都会提前定义好数据类型,毕竟狮子也有打盹的时候。
文档
文档是ES的最小存储单元,数据格式只支持json。ES支持文档里包含文档,复杂的逻辑就是这么实现的(类似于对象套对象)。
MySQL中我们插入的是对象,ES中插入的是文档,这里把文档当成对象会好理解很多。
字段
字段(fields)是Json中的key,一个document可以包含多个fields
分片(Shard)
MySQL中的表都有存储上限,对此我们的解决方案是横向扩展跟纵向扩展,同样的ES(非关系型数据库)也存在存储上限的问题,ES中的数据存放在分片中(Shard),当数据量超过存储上限的时候解决方式是扩展一个新分片。
ES在创建索引时默认是5个主分片,为了提高可用性,ES默认为每个主分片(Primary Shard)分配一个副本分片(Replica Shard)。主分片在创建索引时就固定了,后续无法修改;副本分片是随时可以修改的。
分片要增加时只要新建一个多节点的索引,
其他知识:
- 每个分片(Shard)都是一个lucene实例(index),每个lucene实例都有独立创建索引跟处理请求的能力
- ES会自动均衡各个节点的分片
- 一个文档(document)是不可能同时存在于多个主分片中的,但是可以存在于多个副本分片中。
- 主分片和副本分片不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。
集群(Cluster)
默认一个ElasticSearch就是一个集群(集群名称默认是elasticsearch),多个节点情况下通过配置指定节点所属集。群。
近实时(NRT)
NRT(Near RealTime)是ElasticSearch的核心优势,成为近实时。所谓近实时可以从写入与读取两方面说明:
- 写入:从写入索引数据到可以搜索到有1秒左右的延迟
- 读取:执行搜索和分析可以达到秒级查询(采用倒排索引)
常见产品
毫秒级,秒级别:MySQL,Redis
秒级别:ElasticSearch
分钟级别:Hive