基本概念
有几个概念是Elasticsearch的核心。从一开始就理解这些概念将极大地帮助简化学习过程。
一、近实时(NRT)
Elasticsearch是一个近乎实时的搜索平台。这意味着从索引文档到可搜索文档之间有一个轻微的延迟(通常是一秒钟)。
二、集群(Cluster)
集群是一个或多个节点(服务器)的集合,它们一起保存您的整个数据,并跨所有节点提供联邦索引和搜索功能。集群由一个惟一的名称标识,默认情况下该名称是“elasticsearch”。这个名称很重要,因为只有将节点设置为按其名称加入集群时,节点才能成为集群的一部分。
确保不要在不同的环境中重用相同的集群名称,否则可能会导致节点加入错误的集群。例如,您可以对开发、测试和生产集群使用logging-dev、logging-stage和logging-prod。
请注意,只有一个节点的集群是有效的,而且非常好。此外,您还可以拥有多个独立的集群,每个集群都有自己独特的集群名称。
三、节点(Node)
节点是一个服务器,它是集群的一部分,存储数据,并参与集群的
索引
和
搜索
功能。与集群一样,节点也是通过名称来标识的,默认情况下,名称是在启动时分配给节点的随机全局惟一标识符(UUID)。如果不需要缺省值,可以定义任何需要的节点名称。对于您想要标识网络中的哪些服务器对应于Elasticsearch集群中的哪些节点的管理目的,这个名称非常重要。
可以通过集群名称将节点配置为连接特定的集群。默认情况下,每个节点都被设置为加入一个名为“elasticsearch”的集群,这意味着如果您启动网络上的多个节点——假设它们能够彼此发现——它们将自动形成并加入一个名为elasticsearch的集群。
在单个集群中,您可以拥有任意多的节点。此外,如果您的网络上没有其他运行的Elasticsearch节点,那么默认情况下,启动单个节点将形成一个名为“elasticsearch"的新单节点集群。
四、索引(Index)
索引是具有某种类似特征的文档集合。例如,可以为客户数据建立索引,为产品目录建立另一个索引,为订单数据建立另一个索引。
索引由名称标识
(
必须全部为小写
),当对其中的文档执行索引、搜索、更新和删除操作时,此名称用于引用索引。
在一个集群中,您可以定义任意多的索引。
五、类型(Type)【在V6.0.0中弃用了】
注意:
在Elasticsearch 7.0.0或更高版本中创建的索引不再接受_default_映射。索引在6中创建。x将继续在Elasticsearch 6.x中运行。类型在api 7.0中是不受支持的,它会中断对索引创建、put映射、get映射、put模板、get模板和get字段映射api的更改。
什么是映射类型?(What are mapping types ?)
自从第一次发布Elasticsearch以来,每个文档都存储在一个索引(
Index
)中,并分配了一个映射类型(mapping type)。映射类型用于表示被索引的文档或实体的类型(
Type
),例如twitter索引可能具有用户类型和tweet类型。
每个映射类型都可以有自己的字段,因此用户类型可以有full_name字段、user_name字段和电子邮件字段,而tweet类型可以有内容字段、tweeted_at字段,和用户类型一样,还有user_name字段。
每个文档都有一个包含类型名称的_type元字段,通过在URL中指定类型名称,可以将搜索限制为一个或多个类型
GET twitter/user,tweet/_search { "query": { "match": { "user_name": "kimchy" } } }
_type字段与文档的_id相结合生成_uid字段,因此具有相同_id的不同类型的文档可以存在于一个索引中。
还使用映射类型在文档之间建立父子关系,因此类型为question的文档可以是类型为answer的文档的父文档。
为什么弃用了(Why are mapping types being removed?)
最初,我们讨论了类似于SQL数据库中的“数据库”的“索引”,以及等价于“表”的“类型”。
这是一个错误的类比,导致了错误的假设。在SQL数据库中,表是相互独立的。一个表中的列与另一个表中具有相同名称的列没有关系。这与映射类型中的字段不同。
在Elasticsearch索引中,不同映射类型中具有相同名称的字段在内部由相同的Lucene字段支持。换句话说,使用上面的示例,user类型中的user_name字段存储在与tweet类型中的user_name字段完全相同的字段中,而且两个user_name字段在这两种类型中必须具有相同的
映射
(定义)。
例如,当您想要删除一个类型中的日期字段和同一个索引中的另一个类型中的布尔字段时,这可能会导致失败。
最重要的是,存储在同一索引中具有很少或没有共同字段的不同实体会导致数据稀疏,并影响Lucene有效压缩文档的能力。
基于这些原因,我们决定将映射类型的概念从Elasticsearch中移除。
五、文档(Document)
文档是可以建立索引的基本信息单元。例如,您可以为单个客户创建一个文档,为单个产品创建另一个文档,为单个订单创建另一个文档。该文档用JSON (JavaScript对象表示法)表示,这是一种无处不在的internet数据交换格式。在索引中,可以存储任意数量的文档。
六、分片和副本(
Shards & Replicas
)
索引可能存储大量数据,这些数据可能超过单个节点的硬件限制。例如,一个包含10亿个文档的索引占用1TB的磁盘空间,这个索引可能不适用于单个节点的磁盘,或者速度太慢,无法满足单个节点的搜索请求。
为了解决这个问题,Elasticsearch提供了将索引细分为多个分片的功能。创建索引时,可以简单地定义所需的分片数量。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。
分片之所以重要,主要有两个原因:
- 它允许您水平分割/缩放内容卷
- 它允许跨切分(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量
分片如何分布以及如何将其文档聚合回搜索请求的机制完全由Elasticsearch管理,并且对用户是透明的。
在随时可能出现故障的网络/云环境中,如果分片/节点由于某种原因离线或消失,那么使用故障转移机制是非常有用的,强烈建议使用这种机制。为此,Elasticsearch允许将索引分片的一个或多个副本复制到所谓的复制分片中。
复制之所以重要,主要有两个原因:
- 它在分片/节点失败时提供高可用性。出于这个原因,需要注意的是,复制分片永远不会与复制它的原始/主分片分配在相同的节点上。
- 它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。
总而言之,每个索引可以分成多个分片。索引也可以被复制零次(即没有副本)或多次。复制后,每个索引将具有主分片(从其中复制的原始分片)和复制分片(主分片的副本)。可以在创建索引时为每个索引定义分片和副本的数量。创建索引之后,还可以随时动态更改副本的数量。您可以使用_shrink和_split api更改现有索引的分片数量,但是这不是一项简单的任务,预先计划正确的分片数量是最佳方法。
默认情况下,Elasticsearch中的每个索引分配一个主分片和一个副本,这意味着如果您的集群中至少有两个节点,那么您的索引将有一个主分片和另一个副本分片(一个完整的副本),每个索引总共有两个分片。