# 添加索引
为了将数据添加到 Elasticsearch,我们需要 **索引(index)** —— 存储关联数据的地方。实际上,索引只是一个 **逻辑命名空间(logical namespace)**,它指向一个或多个 **分片(shards)**。
**分片(shard)** 是 **工作单元(worker unit)** 底层的一员,它只负责保存索引中所有数据的一小片。在接下来的《深入分片》一章中,我们还将深入学习分片是如何运作的,但是现在你只要知道分片是一个独立的Lucene实例既可,并且它自身也是一个完整的搜索引擎。我们的文档存储并且被索引在分片中,但是我们的程序并不会直接与它们通信。取而代之,它们直接与索引进行通信的。
在 elasticsearch 中,分片用来分配集群中的数据。把分片想象成一个数据的容器。数据被存储在分片中,然后分片又被分配在集群的节点上。当你的集群扩展或者缩小时,elasticsearch 会自动的在节点之间迁移分配分片,以便集群保持均衡。
分片分为 **主分片(primary shard)** 以及 **从分片(replica shard)** 两种。在你的索引中,每一个文档都属于一个主分片,所以具体有多少主分片取决于你的索引能存储多少数据。
> 虽然理论上主分片对存储多少数据是没有限制的。分片的最大数量完全取决于你的实际状况:硬件的配置、文档的大小和复杂度、如何索引和查询你的文档,以及你期望的响应时间。
从分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求。
索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。
接下来,我们在空的单节点集群中上创建一个叫做 `blogs` 的索引。一个索引默认设置了5个主分片,但是为了演示,我们这里只设置3个主分片和一组从分片(每个主分片有一个从分片对应):
~~~
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
~~~
现在,我们的集群看起来就像下图所示了**有索引的单节点集群**,这三个主分片都被分配在 `Node 1`。
![有索引的单节点集群](https://box.kancloud.cn/2015-06-04_556fdec90423b.png)
如果我们现在查看 **集群健康(cluster-health)** ,我们将得到如下信息:
~~~
{
"cluster_name": "elasticsearch",
"status": "yellow", <1>
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 3,
"active_shards": 3,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 3 <2>
}
~~~
1. 集群的 `status` 为 `yellow`.
1. 我们的三个从分片还没有被分配到节点上。
集群的健康状况 `yellow` 意味着所有的 **主分片(primary shards)** 启动并且运行了,这时集群已经可以成功的处理任意请求,但是 **从分片(replica shards)** 没有完全被激活。事实上,当前这三个从分片都处于 `unassigned`(未分配)的状态,它们还未被分配到节点上。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,就等同于所有的数据副本也丢失了。
现在我们的集群已经可用了,但是依旧存在因硬件故障而导致数据丢失的风险。