基本概念
近实时 (Near Realtime NRT)
Elasticsearch是一个接近实时的搜索平台。 这意味着从索引文档的时间到可搜索的时间都有一个小的延迟(通常是一秒)。
这就意味着当新增数据后最坏情况大概要1秒之后才能被搜索到。
集群
当一台服务器无法满足索引数据容量和查询性能的时候,可以通过水平扩展方式加入更多的服务器来分解数据的容量和搜索的性能。
群集是一个或多个节点(服务器)的集合,它们一起保存整个数据,并在所有节点上提供联合索引和搜索功能。 一个集群由一个唯一的名字来标识,默认是“elasticsearch”。 这个名字很重要,因为如果节点设置为通过名字加入集群,节点只能是集群的一部分。
节点
节点是作为集群一部分的单个服务器,存储数据并参与集群的索引和搜索功能。就像一个集群一样,一个节点由一个名字来标识,默认情况下它是一个在启动时分配给节点的随机通用唯一标识符(UUID)。如果您不需要默认值,您可以定义任何您想要的节点名称。此名称对于管理目的非常重要,您需要确定网络中的哪些服务器对应于Elasticsearch群集中的哪些节点。
索引
索引是具有相似特征的文档的集合。 例如,您可以拥有客户数据的索引,产品目录的另一个索引以及订单数据的另一个索引。 索引由名称标识(必须全部为小写),该名称用于在对索引文档进行索引,搜索,更新和删除操作时引用索引。
在单个群集中,您可以根据需要定义多个索引。
因此索引有点类似数据库中的表,尽管在ES6之前用index类比为数据库,把type类比为数据库中的表。但ES6之后将会把type废弃掉,因此建议新用户不要再用type的概念了。
type
type曾经是您的索引的逻辑类别/分区,允许您在同一个索引中存储不同类型的文档,例如一种类型的用户,另一种类型的博客文章。 在索引中不再可能创建多个类型,并且在后面的版本中将删除整个类型的概念。
具体移除的原因是当一个索引中的结构类似的情况下,Lucene的压缩率会更高,如果在一个索引中创建不同结构的文档,会导致数据的稀疏性。
其实在solr中也没有type的概念,如果用户真要拥有type的概念,可以自己来创建一个type的字段来进行就可以。
文档
文档是可被索引的基本信息单元。 例如,您可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单提供另一个文档。 这个文档是用JSON(JavaScript Object Notation)表示的,它是一个无处不在的互联网数据交换格式。
分片和副本
当一台服务器存储不下当前的数据时,可以用分片的方式来进行存储。
比如:我们有1000万的数据,如果我们有10台服务器,则在每台服务器上只要存储100万条数据就可以了。
这样单纯通过分片的方式,既提高了整体的数据存储容量,并且对于搜索的性能也有很大的提升。
因为如果1000万条数据只存储在一台机器上,假如每1万条数据的搜索性能为1秒,则需要1000秒,而现在被分片到了10台服务器上,并且每台服务器中只有100万条数据,则以并行方式搜索的话,就只要100秒就可以了。
这样搜索的性能也直接从1000秒降低到了100秒。
副本很重要,主要有两个原因:
- 提高了高可用性,因为每份数据会被复制成多份
- 提高了搜索的吞吐量,因为搜索可以在所有副本上并行执行。
总而言之,每个索引可以分成多个碎片。 索引也可以被复制为零(意味着没有复制品)或更多次。 一旦被复制,每个索引将具有主要碎片(从中复制的原始碎片)和副本碎片(主要碎片的副本)。 在创建索引时,可以为每个索引定义分片和副本的数量。 创建索引之后,您可以随时更改动态副本的数量,但不能随意更改碎片的数量。
默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果您的集群中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本) 每个索引10个碎片。