Elasticsearch 是一个高度可扩展且开源的全文检索和分析引擎。它可以让您快速、近实时地存储、检索以及分析海量数据。它通常用作那些具有复杂搜索功能和需求的应用的底层引擎或者技术。
下面是 Elasticsearch 一些简单的使用案例 :

  • 你经营一家网上商店,允许你的客户搜索你销售的产品。在这种情况下,您可以使用 Elasticsearch 来存储您的整个产品的目录和库存,并且为他们提供搜索和自动完成的建议。
  • 您希望收集日志或事务数据,并且希望分析和挖掘这些数据以查找趋势、统计数据、摘要或异常。在这种情况下,您可以使用logstash(elasticsearch/logstash/kibana堆栈的一部分)来收集、聚合和分析您的数据,然后让logstash将这些数据输入elasticsearch。一旦数据进入ElasticSearch,您就可以运行搜索和聚合来挖掘您感兴趣的任何信息。
  • 您运行一个价格警报平台,它允许价格精明的客户指定一个规则,例如“我有兴趣购买特定的电子小工具,如果小工具的价格在下个月内低于任何供应商$x,我希望得到通知”。在这种情况下,您可以获取供应商价格,将其推送到ElasticSearch,并使用其反向搜索(Percolator)功能根据客户查询匹配价格变动,最终在找到匹配后将警报推送给客户。
  • 您有分析/商务智能需求,并且希望快速调查、分析、可视化并针对大量数据(想想数百万或数十亿条记录)提出特别问题。在这种情况下,您可以使用ElasticSearch来存储数据,然后使用Kibana(ElasticSearch/Logstash/Kibana堆栈的一部分)来构建自定义仪表盘,以可视化对您重要的数据方面。此外,还可以使用ElasticSearch聚合功能对数据执行复杂的商业智能查询。

对于本教程的其余部分,我将引导您完成 Elasticsearch 的启动和运行的过程,同时了解其原理,并执行像indexing(索引),searching(查询)和 modifing(修改)数据的基础操作。在本教程的最后一部分,您应该可以清楚的了解到 Elasticsearch 是什么,它是如何工作的,并有希望获得启发。看您如何使用它来构建复杂的搜索应用程序或者从数据中挖掘出想要的信息。

1、基本概念

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

1.1 Near Realtime(NRT 近实时)

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

1.2 Cluster(集群)

集群是一个或者多个节点(服务器)的集合,它们一起保存您的数据,并且所有节点提供联合索引以及搜索功能。集群存在一个唯一的名称标识,该名称默认为 “elasticsearch”。这个名字非常重要,因为如果要将节点加入集群,只能通过设置相同的集群名称加入对应的集群。

请确保在不同环境中使用不同的集群名称,否则可能最终会将节点加入到了错误的集群中。例如,可以使用 logging-dev,logging-stage,以及 logging-prod 用于 development(开发),staging(演示)和 production(生产)集群。

注意,一个有效的良好运行的集群至少要有一个节点。此外,还可以有多个独立的集群并且每个集群都有它自己唯一的cluster name(集群名)。

1.3 Node(节点)

节点是一个单独的服务器,它是集群的一部分,存储数据,并参与集群中的索引和搜索功能。像集群一样,节点也由一个名称标识,默认情况下,该名称是在启动时分配的一个随机的 UUID(通用唯一标识符)。如果不想使用默认名称也可自定义任何节点名称。此名称对于管理目的很重要,因为您希望确定网络中的哪些服务器对应于ElasticSearch集群中的哪些节点。

可以通过配置 cluster name 指定节点加入到对应的集群中。默认情况下,每个节点都会被加入到名为 elasticsearch 的集群中,这也就意味着如果您在网络中启动许多节点(假设它们可以发现彼此),那么它们都将自动形成并加入一个名为 elasticsearch 的集群。

在单个集群中,您可以拥有任意多个节点。此外,如果在当前网络中没有其它 elasticsearch 结点在运行,则启动一个结点将会默认形成一个叫 elasticsearch 的单结点集群。

1.4 Index(索引)

索引是具有某种相似特性的文档集合。例如,您有一个消费者数据的索引,一个产品目录的索引,和一个订单数据的索引。索引通过一个名字(必须全部是小写)来标识,并且该名字在对 document(文档)执行 indexing(索引),search(搜索),update(更新)和 delete(删除)操作时会涉及到。

在单集群中,您可以定义多个索引。

1.5 Type(类型)

在 Index(索引)中,可以定义一个或多个类型。一个类型是索引中一个逻辑的种类/分区,它的语义完全取决于您自己。一般情况下,一个类型被定义成一组常见字段的文档。例如,假设您运行着一个博客平台并且在一个单独的索引中存储了所有的数据。在这个索引中,您也许定义了一个用户数据类型,博客数据类型,和评论数据类型。根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

一种类型曾经是索引的逻辑类别/分区,允许您在同一索引中存储不同类型的文档,例如一种类型用于用户,另一种类型用于博客文章。在一个索引中不能再创建多个类型,在以后的版本中将删除类型的整个概念。有关详细信息,请参见删除映射类型以获取更多信息。

1.6 Document(文档)

文档是索引信息的基本单位。例如,您可以为单个客户创建一个文档,为单个产品创建另一个文档,为单个订单创建另一个文档。文档以 JSON 来表示,它是一种常见的互联网数据交换格式。

在索引/类型中,您可以存储任意多的文档。请注意,尽管文档实际上驻留在索引中,但文档实际上必须被索引/分配给索引中的类型。

1.7 Shards & Replicas(分片 & 副本)

索引可以存储大量数据,这些数据可能会超出单个节点的硬件限制。例如,占用1TB磁盘空间的10亿个文档的单个索引可能不适合单个节点的磁盘,或者速度太慢,无法单独满足单个节点的搜索请求。

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

分片非常重要,主要有两个原因:

  • 它允许您水平拆分/缩放内容量
  • 它允许您跨分片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量

如何分配分片以及如何将其文档聚合回搜索请求的机制完全由ElasticSearch管理,并且对作为用户的您来说是透明的。

在随时可能发生故障的网络/云环境中,非常有用,强烈建议在分片/节点以某种方式脱机或因任何原因消失时使用故障转移机制。为此,ElasticSearch允许您将索引分片的一个或多个副本制作成所谓的副本分片,简称为副本。

副本非常重要,主要有两个原因:

  • 它在分片/节点发生故障时提供了高可用性。因此,副本分片永远不会与主分片在相同的节点上。
  • 它可以让你水平扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行执行。

总而言之,每个索引可以被拆分成多个分片,一个索引可以设置 0 个(没有副本)或多个副本。开启副本后,每个索引将有主分片(被复制的原始分片)和副本分片(主分片的副本)。

可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您可以在任何时候动态的改变副本的数量。您还可以使用shrink(收缩)split(拆分) API更改现有索引的分片数,但这不是一项简单的任务,预先计划正确数量的分片是最佳方法。
默认情况下,Elasticsearch 中的每个索引分配了 5 个主分片和 1 个副本,这也就意味着如果您的集群至少有两个节点的话,您的索引将会有 5 个主分片和另外 5 个副本分片(1 个完整的副本),每个索引共计 10 个分片。

7.0此处变更为如下所述:

默认情况下,Elasticsearch中的每个索引都分配了一个主分片和一个副本,这意味着如果群集中至少有两个节点,则索引将具有一个主分片和另一个副本分片(一个完整副本),每个索引总共2个分片。

注意 :
每个 Elasticsearch 分片是一个 Lucene 索引。在单个 Lucene 索引中有一个最大的文档数量限制。从 LUCENE-5843 的时候开始,该限制为 2,147,483,519(=Interger.MAX_VALUE - 128)个文档。您可以使用 _cat/shards api 来监控分片大小。

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

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!