原文地址:
https://www.elastic.co/guide/en/elasticsearch/reference/current/_exploring_your_cluster.html
之前我们已经将集群运行起来了,下一步是学习怎么与它们沟通。而Elasticsearch正好提供了一个非常全面和强大的REST API文档,用来与集群交互。API实现的几个功能点如下:
-
检查您的集群、节点和索引健康状况、状态和统计信息
-
管理集群、节点、索引数据和元数据
-
索引的增删改查及搜索操作
-
高级的搜索功能,比如分页、排序、过滤、脚本编制、聚合等等
一.检查集群的健康状况
1.查看集群健康
为了检查集群的健康状况,我们使用_cat
API。
GET /_cat/health?v
响应如下:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1541039656 10:34:16 search yellow 3 1 6 6 0 0 6 0 - 50.0%
主要关注如下几个参数:
cluster:集群名称,默认名称为elasticsearch,由于elasticsearch默认使用单播网络发现,在同一个机器上的其他节点只要集群名称相同,就当做同一个集群。
status:健康状况,分为下面三种状态:
green - 一切都很好(集群功能齐全)
yellow - 所有数据都可用,但有些副本尚未分配(集群功能齐全)
red - 有些数据由于某些问题不可用(集群只有部分功能)注意:当集群是红色时,它将继续为可用碎片的搜索请求提供服务,但是您可能需要尽快修复它,因为存在未分配的碎片
2.查看节点
使用以下命令查看集群的节点列表:
GET /_cat/nodes?v
响应如下:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.2.36 99 94 11 0.77 0.41 0.35 mdi * node-1
192.168.2.36 24 94 11 0.77 0.41 0.35 mi - node-2
192.168.2.36 23 94 11 0.77 0.41 0.35 mi - node-3
3.查看索引
GET /_cat/indices?v
响应如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open .kibana nujGq_auS-u2KZRbS7LoUw 1 1 2 0 10.8kb 10.8kb
yellow open event_search lG2RcdO-Q6Wtd5oup-2CCQ 5 1 16107987 0 11.4gb 11.4gb
主要参数的意思:
health:健康状况,分别为green、yellow和red
index:索引名
uuid:唯一标识
pri:主碎片
rep:副本
二.索引的增删改查
1.创建索引
现在,我们创建一个名为“customer”的索引,然后再次列出所有索引:
#使用PUT创建名为“customer”的索引,pretty表示格式化显示json结果
PUT /customer?pretty
GET /_cat/indices?v
2.新增或更新文档
2.1.指定ID新增或替换文档
现在我们在customer索引中添加一些内容。我们将把一个简单的文档索引到customer索引中,ID为1,如下所示:
PUT /customer/doc/1?pretty
{
"name": "John Doe"
}
响应如下:
{
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 1,
"result": "created",
-"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
从上面可以看到,在customer索引中成功创建了一个新的id为1的customer文档。
需要注意的是,Elasticsearch并没有强制要求我们在创建文档时创建索引,创建文档时若对应的索引不存在,将自动创建该索引。
若ID存在则替换原来的文档,不存在则新增
2.2.自生成ID新增文档
这个例子展示了如何在没有显式ID的情况下对文档进行索引,只是用POST代替了PUT调用方式:
POST /customer/_doc?pretty
{
"name": "Jane Doe"
}
2.3.更新文档
除了能够索引和替换文档之外,我们还可以更新文档。不过请注意,Elasticsearch实际上并不会在引擎盖下进行就地更新。每当我们执行更新时,Elasticsearch就会删除旧文档,然后新增新文档。
这个例子展示了如何通过将name字段更改为“Jane Doe”来更新我们以前的文档(ID为1):
POST /customer/_doc/1/_update?pretty
{
"doc": { "name": "Jane Doe" }
}
3.搜索文档
接下来可以搜索刚才创建的文档:
GET /customer/doc/1?pretty
响应如下:
{
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 1,
"found": true,
-"_source": {
"name": "John Doe"
}
}
"found": true
表示找到了对应的文档,文档的具体内容见_source
里面的内容。
4.删除索引与文档
4.1.删除索引
将创建的索引删除:
DELETE /customer?pretty
4.2.删除文档
删除文档相当简单。这个例子展示了如何删除customer索引下对应ID为2的文档:
DELETE /customer/_doc/2?pretty
三.批量处理
除了能够索引、更新和删除单个文档之外,Elasticsearch还可以使用_bulk
API批量执行上述任何操作。它提供了一种非常有效的机制,可以在尽可能少的网络往返的情况下尽可能快地执行多个操作,提高执行效率。
下面的示例就是在一个批量操作中索引两个文档:
POST /customer/doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
这个批量操作更新第一个文档(ID为1),然后删除第二个文档(ID为2):
POST /customer/_doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
响应如下:
{
"took": 48,
"errors": false,
"items": [
{
-"update": {
"_index": "customer",
"_type": "doc",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"status": 200
}
}
]
}
值得注意的是,批量操作不会因为其中的一个操作失败所有的都失败。当bulk API返回时,它将为每个操作提供状态(按照发送的顺序),以便检查某个特定操作是否失败。