有几个概念是Elasticsearch的核心。从一开始(from the outset)就理解这些概念将会极大地帮助你的学习。
Elasticsearch是一个近实时的搜索平台。这意味着从你索引一个文档到它可以检索只需要轻微的延迟(slight latency)(通常是一秒)
集群是一个或多个节点(服务器)的集合(a collection of),它们一起拥有(hold)你的整个数据并跨越所有节点提供联合索引和搜索能力。一个集群由一个独一无二的名字标识,默认是elasticsearch。这个名字很重要,因为一个节点只能通过名字加入一个集群。
确保你我用在不同的环境下使用相同的集群名字,否则你的节点可能会加入错误的集群中。例如你可以分别给开发、临时展示(staging)、最终产品分别起名logging-dev
,logging-stage
和logging-prod
注意在集群中只有一个节点也是可以的。此外,你也可以有许多独立的集群,每个有它自己独特的集群名称。
一个节点是你的集群中的一个单独的服务器,存储你的数据和加入你的集群索引和搜索能力。就像一个集群一样,一个节点也是有名称标志,默认是一个随机的Marvel字符串,在节点启动(startup)时分配。如果你不想使用默认名,可以定义任何你想用的名字。
一个节点能被配置加入特定集群中通过集群名。默认地,每个节点加入集群名为elasticsearch意味着如果你要启动许多节点在你的网络中,假设它们能彼此找到,它们将会自动形成并加入一个单独的(a single)名为elasticsearch的集群。
在一个集群中,你想有多少节点都可以,此外,如果没有其它的Elasticsearch节点当前运行在你的网络上,启动一个单独的节点将会产生名为elasticsearch的单节点集群。
一个索引是文档的集合,它们有某种相似特性。例如,你可以为顾客数据建一个索引,为产品目录建另一个索引,再为订单数据建一个索引。一个索引用一个名字来标记(必须是全部小写)并且这个名字用来关连(refer to)索引,在对(against)其中文档运行检索、搜索、更新和删除操作的时候。
在一个单独的集群中,你可以定义任意多个索引(as many indexes as you want).
在一个索引中,你可以定义一个或多个类型。一个类型是你的索引的一个逻辑目录/划分,它的语义(semantics)完全取决于你。一般而言,一个类型专为一些有特定普通域集合的文档而定义。例如,我们假设你运行一个博客平台(blogging platform)并且在一个单独的索引中存储了你所有的数据。那么在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,再为评论数据定义另外一个类型。
文档是给信息建立索引的基本单位。例如,你可以为每个单独的顾客建立一个文档,再为一个产品建立一个文档,或者一个订单。这个文档用JSON(JavaScript Object Notation)表示(express),这是普遍的(ubiquitous)网络数据交换格式(interchange format)
在一个索引/类型中,你想存储多少文档都可以。注意即使一个文档物理上属于一个索引(reside in an index),一个文档事实上也必须被索引/分配给一个索引内的一个类型。
一个索引可能存储大量的数据,可能超过单个节点的硬盘限制。例如,一个1billion个文档的单个索引会占1TB硬盘空间,可能不适合放在单个节点的硬盘上,或者只从一个节点上进行搜索服务(serve search)可能太慢了。
为了解决这个问题,Elasticsearch提供了能力使你能将索引细分(subdivide)成多份,称为碎片。当你创建一个索引时,你可以简单地定义你想要的碎片的数量。每个碎片在它自身是一个拥有完全功能(fully-functional)并独立的索引,可以主持(be hosted on)集群中的任何节点。
拆分很重要,有两个主要原因:
1. 它可以让你水平分割/扩展(scale)你的内容量
2. 它可以让你横跨多个碎片分发和并行(distribute and parallelize)操作(可能(potentially)在多个节点上),从而提高性能/吞吐量(performance/throughput)
这些机制(mechanics),关于碎片如何分配,以及它的文档如何聚回到搜索请求,是完全由Elasticsearch管理的,对你作为用户来说是完全透明。
在一个网络/云环境,这种随时会发生失败的环境中,万一某碎片/节点不知道什么时候什么原因突然掉线时,拥有故障切换(failover)功能是非常重要的。为此(to this end),Elasticsearch允许你创建一个或多个副本称为碎片副本(replica shards),简称副本(repilcas)
创建副本(Replication)很重要,有两个主要原因:
1. 万一节点崩溃时,它提供高可用性。因为这个原因,注意碎片副本从来不跟源碎片分配在相同的节点上,这点很重要。
2. 它使你能扩展你的搜索量/吞吐量,因为搜索能并行地在所有副本上执行。
总之(to summarize),每个索引能分割到多个碎片中。一个碎片也能有0个副本或多个副本。一旦创建副本,每个索引将会有主碎片(源碎片)和副本碎片。碎片和副本的数量能在索引创建的时候定义在每个索引上。在索引创建以后,你可以动态地更改副本数量,但是你不能在事后(after-the-fact)更改数量碎片(the number shards) (抱歉这块我没读懂)
默认的,Elasticsearch的每个索引都分配给5个主碎片和1个副本,意味着你有至少两个节点在你的集群上,你的索引将会有5个主碎片和另外5个副本碎片(1个完全的副本),也就是每个索引总共10个碎片。
注意:每个Elasticsearch碎片是一个Lucene索引。在单个的Lucene索引中你可以有最大数量有限的文档。在Lucene-5843中(as of),限制为2147473519(=Integer.MAX_VALUE-128)个文档。你能使用_cat/shards api来管理碎片大小。