# Basic Concepts（基础概念）

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_basic_concepts.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_basic_concepts.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260579](http://www.apache.wiki/pages/viewpage.action?pageId=4260579)

贡献者 : [那伊抹微笑](/display/~wangyangting)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

这里有一些关于 **Elasticsearch** 的核心概念。从一开始了解这些概念有助于减少学习过程。

### Near Realtime（NRT 近实时）

**Elasticsearch **是一个近实时的搜索平台。这意味着从您索引一个文档开始直到它可以被查询时会有轻微的延迟时间（通常为一秒）。

### Cluster（集群）

**cluster**（集群）是一个或者多个节点的集合，它们一起保存数据并且提供所有节点联合索引以及搜索功能。集群存在一个唯一的名字身份且默认为 “**elasticsearch**”。这个名字非常重要，因为如果节点安装时通过它自己的名字加入到集群中的话，那么一个节点只能是一个集群中的一部分。

请确保您在不同环境中不要重复使用相同的集群名字，否则您可能最终会将节点加入到了错误的集群中。例如，您可以使用 _**logging-dev**_，_**logging-stage**_，以及 _**logging-prod**_ 用于 **development**（开发），**staging**（演示）和 **production**（生产）集群。

注意，一个集群如果只有一个结点也是有效的，并且完全可行的。此外，您还可以有多个独立的集群并且每个集群都有它自己唯一的 **cluster** **name**（集群名）。

### Node（节点）

**node（**节点）是一个单独的服务器，它是集群的一部分，存储数据，参与集群中的索引和搜索功能。像一个集群一样，一个节点通过一个在它启动时默认分配的一个随机的 **UUID**（通用唯一标识符）名称来识别。如果您不想使用默认名称您也可自定义任何节点名称。这个名字是要识别网络中的服务器对应这在您的 **Elasticsearch** 集群节点管理的目的是很重要的。

节点可以通过配置 **cluster name** 来加入到指定的集群中。默认情况下，每个节点安装时都会加入到名为 **elasticsearch** 的集群中，这也就意味着如果您在网络中启动许多节点--假设它们可以发现彼此–它们全部将自动的构成并且加入到一个名为 **elasticsearch** 的单独的集群中。

在一个集群中，你需要多少就可以添加多少结点。此外，如果在当前网络中没有其它 **elasticsearch **结点在运行，则启动一个结点将会默认形成一个叫 **elasticsearch **的单结点集群。

### Index（索引）

**index**（索引）是具有稍微类似特征文档的集合。例如，您有一个消费者数据的索引，一个产品目录的索引，和另一个是订单数据的索引。一个索引通过名字（必须全部是小写）来标识，并且该名字在对 **document**（文档）执行 **indexing**（索引），**search**（搜索），**update**（更新）和 **delete**（删除）操作时会涉及到。

在一个单独的集群中，您可以定义您想要的许多索引。

### Type（类型）

在 **Index**（索引）中，可以定义一个或多个类型。一个类型是索引中一个逻辑的种类/分区，它的语义完全取决于您自己。一般情况下，一个类型被定义成一组常见字段的文档。例如，假设您运行着一个博客平台并且在一个单独的索引中存储了所有的数据。在这个索引中，您也许定义了一个用户数据类型，博客数据类型，和评论数据类型。

### Document（文档）

**document**（文档）是索引信息的基本单位。例如，您有一存储 **customer**（客户）数据的文档，另一个是存储 **product**（产品）数据的文档，还有一个是存储 **order**（订单）数据的文档。该文档可以使用 [JSON](http://json.org/) 来表示，它是一种无处不在的互联网数据交换格式。

在索引/类型中，您可以存储许多文档。注意，尽管一个文档物理的存在于索引中，实际上一个文档必须被 索引/分配 给索引内的类型。

### Shards & Replicas（分片 & 副本）

索引可以存储大量数据，可以超过单个节点的硬件限制。例如，十亿个文档占用了 **1TB **的磁盘空间的单个索引可能不适合放在单个节点的磁盘上，并且从单个节点服务请求会变得很慢。

为了解决这个问题，**Elasticsearch** 提供了把 **Index**（索引）拆分到多个 **Shard**（分片）中的能力。在创建索引时，您可以简单的定义 **Shard**（分片）的数量。每个 **Shard** 本身就是一个 **fully-functional**（全功能的）和独立的 “**Index**（索引）”，（Shard）它可以存储在集群中的任何节点上。

**Sharding**（分片）非常重要两个理由是 : 

*   水平的拆分/扩展。
*   分布式和并行跨 Shard 操作（可能在多个节点），从而提高了性能/吞吐量。

**Shard** 的分布式机制以及它的文档是如何聚合支持搜索请求是完全由 **Elasticsearch** 管理的，并且是对用户透明的。

在 网络/云 环境中可能随时会故障，无论出于何种原因，在 **shard/node** 不知何故会离线或者消失的情况下强烈建议设置故障转移是非常有效的。为了达到这个目的，**Elasticsearch** 可以让您设置一个或多个索引的 **Shard** 副本到所谓的副本分片，或者副本中去。

副本非常重要的两个理由是 : 

*   在 **shard/node** 故障的情况下提供了高可用性。为了达到这个目的，需要注意的是在原始的/主 **Shard** 被复制时副本的 **Shard** 不会被分配到相同的节点上。
*   它可以让你水平扩展搜索量/吞吐量，因为搜索可以在所有的副本上并行执行。

总而言之，每个索引可以被拆分成多个分片，一个索引可以设置 **0** 个（没有副本）或多个副本。开启副本后，每个索引将有主分片（被复制的原始分片）和副本分片（主分片的副本）。分片和副本的数量在索引被创建时都能够被指定。在创建索引后，您也可以在任何时候动态的改变副本的数量，但是不能够改变分片数量。

默认情况下，**Elasticsearch** 中的每个索引分配了 **5** 个主分片和 **1** 个副本，这也就意味着如果您的集群至少有两个节点的话，您的索引将会有 **5** 个主分片和另外 **5** 个副本分片（**1** 个完整的副本），每个索引共计 10 个分片。

注意 :

每个 **Elasticsearch** 分片是一个 **Lucene** 索引。在单个 **Lucene** 索引中有一个最大的文档数量限制。从 `[LUCENE-5843](https://issues.apache.org/jira/browse/LUCENE-5843) 的时候开始，该限制为 **2,147,483,519**（=**Interger.MAX_VALUE** - **128**）个文档。您可以使用 [`_cat/shards`](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html "cat shards") **api** 来监控分片大小。`

理解了这些基础概念之后，让我们开始接触更有趣的部分 、、、