# 添加索引

为了将数据添加到 Elasticsearch，我们需要 **索引(index)** —— 存储关联数据的地方。实际上，索引只是一个 **逻辑命名空间(logical namespace)**，它指向一个或多个 **分片(shards)**。

**分片(shard)** 是 **工作单元(worker unit)** 底层的一员，它只负责保存索引中所有数据的一小片。在接下来的《深入分片》一章中，我们还将深入学习分片是如何运作的，但是现在你只要知道分片是一个独立的Lucene实例既可，并且它自身也是一个完整的搜索引擎。我们的文档存储并且被索引在分片中，但是我们的程序并不会直接与它们通信。取而代之，它们直接与索引进行通信的。

在 elasticsearch 中，分片用来分配集群中的数据。把分片想象成一个数据的容器。数据被存储在分片中，然后分片又被分配在集群的节点上。当你的集群扩展或者缩小时，elasticsearch 会自动的在节点之间迁移分配分片，以便集群保持均衡。

分片分为 **主分片(primary shard)** 以及 **从分片(replica shard)** 两种。在你的索引中，每一个文档都属于一个主分片，所以具体有多少主分片取决于你的索引能存储多少数据。

> 虽然理论上主分片对存储多少数据是没有限制的。分片的最大数量完全取决于你的实际状况：硬件的配置、文档的大小和复杂度、如何索引和查询你的文档，以及你期望的响应时间。

从分片只是主分片的一个副本，它用于提供数据的冗余副本，在硬件故障时提供数据保护，同时服务于搜索和检索这种只读请求。

索引中的主分片的数量在索引创建后就固定下来了，但是从分片的数量可以随时改变。

接下来，我们在空的单节点集群中上创建一个叫做 `blogs` 的索引。一个索引默认设置了5个主分片，但是为了演示，我们这里只设置3个主分片和一组从分片（每个主分片有一个从分片对应）：

```javascript
PUT /blogs
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}
```

现在，我们的集群看起来就像下图所示了**有索引的单节点集群**，这三个主分片都被分配在 `Node 1`。

![有索引的单节点集群](https://461343799-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxzaY8ZfuJEGWWeGD8E%2F-Lxzb0uVhLUx-0m4Ls6D%2F-Lxzb4OB_BO6uMxiwtfE%2F02-02_one_node.png?generation=1578393977755847\&alt=media)

如果我们现在查看 **集群健康(cluster-health)** ，我们将得到如下信息：

```javascript
{
   "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`.
2. 我们的三个从分片还没有被分配到节点上。

集群的健康状况 `yellow` 意味着所有的 **主分片(primary shards)** 启动并且运行了，这时集群已经可以成功的处理任意请求，但是 **从分片(replica shards)** 没有完全被激活。事实上，当前这三个从分片都处于 `unassigned`（未分配）的状态，它们还未被分配到节点上。在同一个节点上保存相同的数据副本是没有必要的，如果这个节点故障了，就等同于所有的数据副本也丢失了。

现在我们的集群已经可用了，但是依旧存在因硬件故障而导致数据丢失的风险。
