探索集群

REST API

现在我们的集群(节点)已经跑起来了,下一步就是如何与它交互。幸运的是 Elasticsearch 提供了方便理解并且强大的 REST API 供你和 ES 集群进行交互,API 能做的事情如下:

  • 检查集群,节点以及索引的健康状况,状态,以及统计信息。
  • 管理你的集群,节点,以及索引的数据和元数据
  • 提供CURD(Create, Read, Update, 和 Delete)以及对索引的搜索操作。
  • 进行一些诸如 分页,排序,脚本,聚合等高阶搜索操作,还有更多其他的。 (译者批注:为了搜索性能,译者不推荐一些高阶操作例如脚本,把逻辑运算放到引擎中,有点类似关系型数据库的存储过程或者函数,效率并不高,而且使用场景可以通过业务进行优化。

集群健康

我们先进行一个基本的健康检查,看下集群如何运作。我们将使用 curl 命令工具,但你也可以使用任何能够发起 http/rest 协议请求的工具(译者批注:Windows 用户也要先安装 curl 工具,或者使用一些浏览器插件,例如火狐的 HttpRequester,或者 chrome 的 sense,我个人推荐 sense,这个是专门为ES定制的)。假设我们在刚才启动的 ES 节点,我们打开一个新的控制台。 检查集群健康要使用 _cat API,记得之前我们节点的端口是9200:

curl ‘localhost:9200/_cat/health?v’

响应内容如下:

epoch timestamp cluster status node.total node.data shards pri relo init unassign 1394735289 14:28:09 elasticsearch green 1 1 0 0 0 0 0

可以看出我们的集群 elasticsearch 状态是 green。 每当我们请求集群健康状态时,我们会得到 green , yellowred 。绿色表示一切 OK (此时集群功能齐全),黄色表示集群的数据齐全,但是有些副本还没有分配(译者批注:或者说副本丢失)(此时集群功能齐全),红色表示无论出于什么原因,部分数据丢失。注意即使集群处于红色状态,他仍旧是部分可用的(搜索请求在可用的分片上仍旧有效),但是你还是需要尽快修复它,毕竟数据不全了。

我们也能从相应中看出,我们有一个节点,由于没有数据我们的分片数是0。注意,因为我们使用默认的集群名 elasticsearch,并且因为 Elasticsearch 默认使用单播的节点发现方式发现同台机器上的其他节点,有可能你会无意中启动了多个节点而把他们加入到集群中,这样你可能会在相应中看到不止一个节点。 我们可以通过如下命令得到节点列表:

curl ‘localhost:9200/_cat/nodes?v’

响应如下:

host ip heap.percent ram.percent load node.role master name mwubuntu1 127.0.1.1 8 4 0.00 d * New Goblin

我们可以看到名为 New Goblin 的节点,集群中唯一的节点。

展示全部节点

一起来看下我们的索引信息

curl ‘localhost:9200/_cat/indices?v’

响应结果:

health index pri rep docs.count docs.deleted store.size pri.store.size

很明显这代表我们的集群中没有索引

创建索引

现在我们创建一个名为 customer 的索引,然后再看下索引列表:

curl -XPUT ‘localhost:9200/customer?pretty’ curl ‘localhost:9200/_cat/indices?v’

第一条命令使用 PUT 请求创建一个 “customer” 索引,后面加上 pretty 参数是为了让响应的 json 格式化输出。 响应分别如下:

  1. {
  2. "acknowledged" : true
  3. }

health index pri rep docs.count docs.deleted store.size pri.store.size yellow customer 5 1 0 0 495b 495b

第二条命令我们知道我们有一个 customer 索引,它包含5个主分片和1个副本(默认配置),并且索引不包含文档。

可能你也注意到了,集群状态现在被标注了黄色,之前讨论过黄色表示存在副本未分配,该现象的原因是 ES 默认为这个索引创建一个副本,由于我们集群只有一个节点,为保证高可用,副本无法进行分配,直到有新的节点加入集群才行。一旦副本能够分配到第二个节点上,节点的健康状态就会切换成绿色。

索引并查询文档

现在我们写点数据到我们的 customer 索引中,记得我们之前说过,文档插入索引需要指定索引的类型。 现在插入一个简单的文档,类型叫 external,ID为1,json 文档为:{ “name”: “John Doe” },命令如下:

curl -XPUT ‘localhost:9200/customer/external/1?pretty’ -d ‘ { “name”: “John Doe” }’

响应如下:

  1. {
  2. "_index" : "customer",
  3. "_type" : "external",
  4. "_id" : "1",
  5. "_version" : 1,
  6. "created" : true
  7. }

上面可以看出我们在 customer 索引的 external 类型中创建了一个文档,文档有一个内部 id,在索引期间指定的。

有个关键点需要注意,在你创建文档到某个索引的时候,ES并不强求你显示的先创建索引,如果 customer 索引不存在,ES 会自动创建。

下面我们取回刚才创建的文档:

curl -XGET ‘localhost:9200/customer/external/1?pretty’

响应如下:

  1. {
  2. "_index" : "customer",
  3. "_type" : "external",
  4. "_id" : "1",
  5. "_version" : 1,
  6. "found" : true, "_source" : { "name": "John Doe" }
  7. }

除了一个 found 字段,它表示我们得到了一个id为1的文档,以及另一个字段 _source ,它包含了我们上一步索引的文档完整内容之外,其他没有什么特别的。

删除索引

现在我们删除刚才创建的索引,并再次列出全部索引

curl -XDELETE ‘localhost:9200/customer?pretty’ curl ‘localhost:9200/_cat/indices?v’

响应分别如下:

  1. {
  2. "acknowledged" : true
  3. }

health index pri rep docs.count docs.deleted store.size pri.store.size

表明我们成功删除了一个索引,现在集群恢复到了刚才启动时候的状态。

进行下一步之前,我们再仔细看下之前学习的 API:

curl -XPUT ‘localhost:9200/customer’ curl -XPUT ‘localhost:9200/customer/external/1’ -d ‘ { “name”: “John Doe” }’ curl ‘localhost:9200/customer/external/1’ curl -XDELETE ‘localhost:9200/customer’

如果仔细分析下以上的命令,我们可以发现访问ES中数据的一个模式。这个模式可以被总结为:

curl -X :///

这个REST命令普适于 ES 中全部 API 命令,记住这个会为你学习 ES 开个好头。