一个索引可以定义一个或多个类型。类型是索引的逻辑类别/分区,你怎么理解都行。通常,为具有一组公共字段的文档定义一种类型。例如,一个博客平台,假如将所有数据存储在单个索引中。在此索引中,可以定义用户数据类型,博客数据类型以及评论数据类型。
文档(document)文档是可以被索引的基本单位。例如,用一个文档保存某个客户的数据,或者保存单个产品的数据,或者保存单个订单的数据。文档使用JSON表示。在索引/类型中可以存储大量文档。值得注意的是,尽管文档本质上是存放在索引中,但实际上是被索引/分配到索引中的一个类型中。
分片和副本(shards & replicas)一个索引可能存储海量数据,有可能超过单个节点的硬盘容量。例如,某个索引存储了10亿个文档,占用1TB的硬盘空间,单个节点的硬盘有可能不足以存储那么大的数据量,就算可以存储下,但是可能会降低服务器处理搜索请求的速度。
为了解决这个问题, elasticsearch 提供了分片功能,即将索引细分。创建索引时,可以简单地定义所需的分片数。每个分片本身就具备索引的全部功能,可以存放在集群中的任何一个节点。
分片很重要,主要原因有两个:
它允许您水平分割/缩放您的内容量
它允许你并行地分发操作到多个节点的分片上,从而可以提升性能或吞吐量。
碎片分发的机制,以及它的文档如何汇总回到搜索请求中完全由Elasticsearch管理,并且对用户来说是透明的。
在网络/云环境中,任何时候都可能发生故障,分片会非常有用,并强烈建议使用故障转移机制,以防止分片/节点脱机或消失。为此, elasticsearch 允许您将索引的分片复制一份或多份,也就是所谓的复制分片,或简写为副本。
副本很重要,主要原因有两个:
如果分片/节点出现故障,则可提供高可用性。因此,要注意,副本与其复制的原始/主分片不能分配在同一节点上。
它允许您扩展搜索量/吞吐量,因为可以对所有副本并行执行搜索。
总而言之,每个索引可以分为多个分片。每个索引也可以被复制零次(意味着没有副本)或多次。一旦复制,每个索引将具有主分片(复制的原始分片)和副分片(主分片的副本)。可以在创建索引时根据索引定义碎片和副本的数量。创建索引后,您可以随时动态更改副本数,但不能更改事后的分片数。
默认情况下,每个索引都会被分配5个主分片和1一个复制分片,这意味着如果你的集群中有两个节点,你的索引将会有5个主分片和5个复制分片,总共有10个分片。
每个 elasticsearch 分片是一个 Lucene index ,一个 Lucene 索引中可以有很多的文档,截至 LUCENE-5843 ,最多2,147,483,519(= Integer.MAX_VALUE - 128) 个文档. 可以使用 _cat/shards api监视分片大小。