🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 基本概念 Elasticsearch有几个核心概念。开始学习Elasticsearch之前理解这些概念会对整个学习过程有很大的帮助。 ## 接近实时(NRT) Elasticsearch是一个近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是一秒)。 ## 集群(cluster) 一个集群就是由一个或多个节点组织在一起, 它们共同持有你全部的数据, 并一起提供索引和搜索功能。 一个集群由一个唯一的名字标识, 这个名字默认就是“elasticsearch”。 这个名字很重要, 因为一个节点只能通过指定某个集群的名字来加入这个集群。 请确保您在不同环境中不要重复使用相同的集群名字,否则您最终可能会将节点加入到了错误的集群中。譬如你可以使用`logging-dev`、`logging-stage`、`logging-prod`来作为开发、演示、生产环境的集群名。 注意,一个集群中只包含一个节点也是合法的。另外,你也可以拥有多个集群,只需确保集群的名字唯一。 ## 节点(node) 一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。 和集群类似, 一个节点也是由一个名字来标识的, 默认情况下, 在节点启动时会随机分配一个全局唯一标示来作为它的名字,如果你不希望是默认的你也可以自己指定。这个名字在集群管理时很重要,因为在管理过程中,你希望根据这个名称去确定网络中的服务器对应的是Elasticsearch集群中的哪个节点。 一个节点可以通过配置集群名称来加入一个指定的集群。 默认情况下,每个节点都会被安排加入到一个叫做`elasticsearch`的集群中,这意味着,如果你在你的网络中启动了若干个节点, 并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做`elasticsearch`的集群中。 在一个集群里可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做`elasticsearch`的单节点集群。 ## 索引库(index) 一个索引库就是一些拥有相似特征文档的集合。例如,你可以有一个会员数据的索引库,一个商品目录的索引库,还有一个订单数据的索引库。一个索引库由一个名字来标识(必须全部是小写字母的),在对 document(文档)执行 indexing(索引),search(搜索),update(更新)和 delete(删除)动作时都需要通过此名字来操作。 ## 类型(type) > 警告 > > Deprecated in 6.0.0. See [Removal of mapping types](https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html) A type used to be a logical category/partition of your index to allow you to store different types of documents in the same index, eg one type for users, another type for blog posts. It is no longer possible to create multiple types in an index, and the whole concept of types will be removed in a later version. See [Removal of mapping types](https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html) for more. ## 文档(document) 文档是索引信息的基本单位。。理由,你可以拥有某一个会员文档、一个商品文档、一个订单文档。文档以[JSON](http://json.org/)格式来表示,[JSON](http://json.org/)是一个到处存在的互联网数据交互格式。 在一个索引库或类型里面,你可以存储任意多的文档。注意,一个文档物理上存在于一个索引库之中,但文档必须被编入或分配到一个索引库的类型。 ## <span id="getting-started-shards-and-replicas">分片和副本(shards and replicas)</span> 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引库需要占据1TB的磁盘空间,他将不可能存储在单一节点、或者处理搜索请求响应会非常慢。 为了解决这个问题,Elasticsearch提供了将索引库划分成多个分片的能力。当你创建一个索引库的时候,你可以指定你想要的分片的数量。每个分片本身也是一个全功能且独立的“索引”,这个“索引” 可以被放置到集群中的任何节点上。 分片之所以重要,主要有两方面的原因: * 允许你水平的拆分与扩展容量 * 允许你在分片(位于多个节点上)之间进行分布式的、并行的操作,进而提高性能与吞吐量 至于分片怎样分布、搜索请求时它的文档怎样聚合返回,完全由Elasticsearch管理,对于用户来说这些都是透明的。 在一个网络或云的环境里异常时可预见的。在分片或节点因为某些原因处于离线状态或者消失的情况下,故障转移机制是非常有用且强烈推荐的。为此,Elasticsearch允许你为分片创建一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本。 副本之所以重要,有两个主要原因: * 在分片/节点失败的情况下,副本提供了高可用性。基于整个原因,副本分片不要与原分片或主要分片存放在同一节点上是非常重要的。 * 因为搜索可以在所有的副本上并行运行,副本可以扩展你的搜索量或吞吐量。 总之,每个索引库可以被分成多个分片。一个索引也可以被复制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)api来监控分片大小。 理解了这些基础概念之后,让我们开始接触更有趣的部分...... > my note > > 6.0.0开始一个index下只能有一个type([出于何种考虑?](https://elasticsearch.cn/article/337)) > 副本分片不要与原分片或主要分片存放在同一节点上 > 单个 Lucene 索引中最大的文档数量限制:2,147,483,519(=Interger.MAX_VALUE - 128) > > 问题 > * 倒排索引、倒排列表与索引和分片的关系? > * 单个节点是否有完整的数据? > * 数据究竟是如何存储的?