Curl操作Elasticsearch的常用方法

本文基于 ELK 6.7 版本进行测试验证,如果你的版本不一致,可能需要稍微调整相关语法。

在 Elasticsearch 日常维护过程中,很多信息、配置和临时的调整都可以通过命令行的方式操作生效,不必通过配置文件修改,这就要求我们运维人员对于常用的 API 比较熟悉。本文整理了 elasticsearch 日常运维过程中常用的 API,详细说明如果通过 curl 命令来调用这些API。

[TOC]

集群信息

  • 查看集群描述和集群版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ curl -XGET http://localhost:9203
{
"name" : "es-node3",
"cluster_name" : "es-cluster",
"cluster_uuid" : "vF9I5eNwQo-UrQc-hDLFuQ",
"version" : {
"number" : "6.7.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "8453f77",
"build_date" : "2019-03-21T15:32:29.844721Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
  • 检查集群的健康状态
1
2
3
$ curl -XGET http://192.18.8.7:9203/_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
1657161542 10:39:02 performance6 green 31 22 13138 6569 0 0 0 0 - 100.0%
  • 获取集群节点
1
$ curl -XGET http://192.18.8.7:9203/_cat/nodes?v
  • 获取集群配置
1
$ curl -XGET http://localhost:9203/_cluster/settings

索引相关

  • 查看索引信息。
1
$ curl -XGET http://localhost:9201/_cat/indices?v
  • 查看索引配置
1
$ curl -XGET http://localhost:9201/xxx/_settings

文档相关

  • 查询索引
1
$ curl -XGET http://localhost:9202/kibana_sample_data_logs/_search?pretty
  • 添加一条文档
1
2
3
4
$ curl -XPOST http://localhost:9202/student/_doc/2
{
"name" : "wang"
}
  • 查询索引中的一条具体信息
1
2
3
4
5
6
7
8
9
10
11
12
13
```



1、Index API 索引文档,为文档创建索引。

```sh
curl -XPUT "http://localhost:9200/twitter/tweet/1"; -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'

返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_shards" : {
"total" : 2, #表示应该在多少个节点执行操作
"failed" : 0, #表示失败的个数
"successful" : 2 #表示成功的个数,正常情况最小应该是1
},
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 1,
"created" : true,
"result" : created
}

上面的例子,如果索引不存在,则会自动创建索引及动态映射关系。如果想要关掉这两个特性,可以修改节点上配置文件中action.auto_create_index以及index.mapper.dynamic两项的值为 false。

使用这个API发送两次请求,即便插入的数据一模一样,仍然会在索引中创建两个文档。如果不能接受这个结果,那就需要使用 _update API,并将detect_noop参数打开。

2、GET API 获取文档
该API能够基于文档ID获取一份格式化的JSON文档。除了支持通过GET获取文档信息,也支持通过HEAD方法检查文档是否存在。

1
2
curl -XGET 'localhost:9200/twitter/tweet/0?pretty'
curl -XHEAD 'localhost:9200/twitter/tweet/0?pretty'

返回结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_index" : "twitter",
"_type" : "tweet",
"_id" : "0",
"_version" : 1,
"found": true,
"_source" : {
"user" : "kimchy",
"date" : "2009-11-15T14:12:12",
"likes": 0,
"message" : "trying out Elasticsearch"
}
}

3、* Delete API 删除文档 *
该API允许我们根据ID删除某个索引中的文档。

1
curl -XDELETE 'localhost:9200/twitter/tweet/1?pretty'

结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
},
"found" : true,
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 2,
"result": "deleted"
}

删除文档时,如果该索引不存在,则Elasticsearch会自动创建索引和自动映射关系。这个官方文档中有这个文字,但是我自己实验的却没有这样的结果,而是收到 index_not_found_exception 的错误。

4、* Delete By Query API 根据条件删除 *
该API会对满足查询条件的所有文档执行删除操作。示例如下

1
2
3
4
5
6
7
8
9
curl -XPOST 'localhost:9200/twitter/_delete_by_query?pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"message": "some message"
}
}
}
'

返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"took" : 147, #
"timed_out": false,
"deleted": 119,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"total": 119,
"failures" : [ ]
}

该API接受的URL参数prettyrefreshwait_for_completionwait_for_active_shardstimeout。如果想要获取正在执行的删除人物,可以通过Task API。

1
curl -XGET 'localhost:9200/_tasks?detailed=true&actions=*/delete/byquery&pretty'

也可以对删除操作进行取消。

1
curl -XPOST 'localhost:9200/_tasks/task_id:1/_cancel?pretty'

5、* Update API 更新API *
我觉得这是很多人对ELK误解最深的地方,以为ELK不支持更新功能,数据只能一次性导入,其实ELK是有更新API的。更新API首先从ES获取文档,然后根据请求对文档进行更新,最后将更新保存至服务器。这个过程中使用版本号 Version 来确保文档没有被其他人修改过。

1
2
3
4
5
6
curl -XPUT 'localhost:9200/test/type1/1?pretty' -H 'Content-Type: application/json' -d'
{
"counter" : 1,
"tags" : ["red"]
}
'

也可以通过Script进行更新

1
2
3
4
5
6
7
8
9
10
11
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -H 'Content-Type: application/json' -d'
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
}
}
'

6、* Update by Query API 根据条件更新 *
类似于根据条件查询,这个API可以根据条件对多个文档进行更新。

1
2
3
4
5
6
7
8
9
curl -XPOST 'localhost:9200/twitter/_update_by_query?conflicts=proceed&pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"term": {
"user": "kimchy"
}
}
}
'

多文档操作API

1、* MULTI GET API 获取多个文档*
MULTI GET API允许我们根据索引、类型和ID来获取多个文档,返回结果放在docs数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
curl -XGET 'localhost:9200/_mget?pretty' -H 'Content-Type: application/json' -d'
{
"docs" : [
{
"_index" : "test",
"_type" : "type",
"_id" : "1"
},
{
"_index" : "test",
"_type" : "type",
"_id" : "2"
}
]
}
'

2、BULK API
BULK API提供了在一次请求中更新大量文档的可能,这将极大的提高索引的速度。

3、Reindex API 重建索引

1
2
3
4
5
6
7
8
9
10
11
12

```bash
curl -XPOST 'localhost:9200/_reindex?pretty' -H 'Content-Type: application/json' -d'
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
'

3、Term Vectors
TODO 待补充

4、Multi termvectors API
TODO 待补充

5、**?refresh**
TODO 待补充

本文所有示例基于ELK 5.6。

参考资料:

  1. Elasticsearch Docs
  2. Optimistic Concurrency Control
  3. Elasticsearch merge 你懂了吗?
  4. ES学习之curl命令操作索引

cocowool

A FULL STACK DREAMER!