ElasticSearch入门教程(1)—探索ES集群

REST API

现在,当我们建立和运行ElasticSearch集群和Kibana可视化工具之后,就可以开始学习如何与ElasticSearch进行通信了。幸运的是,ElasticSearch提供了非常全面和强大的REST API,你可以在Kibana的开发工具中使用这些REST API,这样便能和集群进行交互。你可以通过REST API处理以下几个事项:

  • 检查你的集群、节点和索引的健康、状态和统计数据。
  • 管理你的集群、节点、索引数据和元数据。
  • 对你的索引进行CRUD(创建、读取、更新和删除)和搜索操作。
  • 执行高级搜索操作,如分页、排序、筛选、脚本、聚合,以及很多其他操作。

集群健康

我们可以从基本的健康检查开始学习,我们可以观察ElasticSearch集群正在做什么。我们将在Kibana的开发工具中进行健康检查,但是你也可以使用任何能够发起HTTP/REST调用的工具。

若要检查集群健康状态,我们可以使用名为_cat的API。我们可以在Kibana的开发工具中运行以下命令:

  1. GET /_cat/health?v

集群的响应如下图所示:

获取集群健康状态

我们可以看到,我们的集群名为“elasticsearch”,健康状态为绿色。

每当我们查询集群的健康状态,我们看到的状态只会是绿色、黄色或红色:

  • 绿色 — 集群正常工作(集群功能完备)。
  • 黄色 — 所有数据都是可用的,但是某些复制尚未分配(集群功能完备)。
  • 红色 — 无论什么原因,某些数据是不可用的(集群部分功能可用)。

注意:当集群的健康状态变为红色时,集群仍然可以通过可用的分片为搜索请求提供服务,但是你最好尽快解决健康问题,因为集群中还有尚未分配的分片。

从上述的响应信息,我们还可以看到1个节点,其中有13个索引分片,它们是Kibana为了监控集群而创建的索引。注意,因为我们使用默认的集群名称(elasticsearch),并且ElasticSearch默认会使用单播网络发现来找到相同主机上的其他节点,所以当你在同一台主机中启动多个节点时,这些节点很有可能意外地加入同一个集群。在这种情况下,你有可能在上述响应信息中看到多个节点。

我们还可以在Kibana的开发工具中运行以下命令,获取节点列表:

  1. GET /_cat/nodes?v

集群的响应如下图所示:

集群的节点列表

此处,我们可以看到一个名为“TE576pU”的节点,它是我们集群中当前包含的唯一节点。

列出所有索引

现在,可以看看我们的索引:

  1. GET /_cat/indices?v

集群的响应如下图所示:

集群的索引列表

可以看到,目前集群中有13个索引。

创建索引

现在,我们可以创建一个名为customer的索引,然后再次列出所有的索引:

  1. PUT /customer?pretty
  2. GET /_cat/indices?v

第一个命令会使用PUT指令创建一个名为customer的索引。我们会在命令最后添加pretty关键字,提示控制台优雅地输出JSON响应信息(如果有的话)。

集群的响应如下图所示:

客户索引示例

第二个命令的结果会告诉我们,集群现在有一个名为customer的索引,它有5个主分片和1个复制分片(默认配置),这个索引包含0个文档。

你可能还会注意到,customer索引的健康状态是黄色的。正如前文所述,黄色表示某些复制尚未分配。之所以出现这样的问题,是因为ElasticSearch默认会为这个索引创建一个复制分片。由于我们目前只有一个节点正在运行,因此在另一个新节点加入集群之前,我们还不能为这个索引分配复制分片(为了实现高可用功能)。一旦将这个复制分片分配至第二个节点之中,这个索引的健康状态就会变为绿色。

文档的索引和查询

现在我们可以向customer索引添加一些文档。在索引某个文档之前,我们必须告诉ElasticSearch,这个文档应该归属于索引中的何种类型。

我们将一个简单的客户文档索引至customer索引的“external”类型之中,这个文档只有一个等于1的ID:

  1. PUT /customer/external/1?pretty
  2. {
  3. "name": "John Doe"
  4. }

集群的响应如下图所示:

索引客户文档

我们从上述的响应信息可以看到,一个新建的客户文档已经成功地添加至customer索引的“external”类型之中了。这个文档还有一个取值为1的内部id,我们在索引文档时指定了这个取值。

需要注意的是,在你可以将文档索引至某个索引之前,ElasticSearch不会要求你显式地创建这个索引。在前面的示例中,如果在索引文档之前,customer索引事先不存在,那么ElasticSearch将会自动创建customer索引。

现在,我们可以获取刚刚索引的文档:

  1. GET /customer/external/1?pretty

集群的响应如下图所示:

获取客户文档

响应信息包含两个有特殊意义的字段:

  • found:表示我们找到一个请求ID为1的文档;
  • _source:表示返回完整的JSON文档,这个文档是先前我们索引的客户文档。

删除索引

现在,我们将删除刚刚创建的索引,然后再次列出所有的索引:

  1. DELETE /customer?pretty
  2. GET /_cat/indices?v

集群的响应如下图所示:

删除示例索引之后的索引列表

我们从响应信息可以看到,先前创建的索引已经成功删除,我们的集群又恢复至先前的状态了。

在我们继续深入学习之前,我们还要再仔细复习本文学到的一些API命令:

  1. PUT /customer
  2. PUT /customer/external/1
  3. {
  4. "name": "John Doe"
  5. }
  6. GET /customer/external/1
  7. DELETE /customer

如果我们仔细学习了上述命令,我们可以发现访问ElasticSearch数据的一个模式。这个模式可以总结如下:

  1. <REST Verb> /<Index>/<Type>/<ID>

这种REST访问模式适用于所有的API命令,如果你能够简单地记住这个模式,那么你在掌握ElasticSearch时就能有一个良好的开端。