Elasticsearch基本CURD操作语法讲解

当我们的ES 集群搭建完成以后,我怎么能看到集群中各个节点状态以及主节点和健康情况呢,如下讲解使用 curl 命令来与ES 集群进行交互、分别有查询主节点情况、集群状态、以及创建索引查看索引、查看分片以及对ES 集群进行查询请求等操作。

CURL 语法讲解

RESTful API:
curl -X<VERB> ‘<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>’ -d ‘<BODY>’
-X:指定请求方式

<VERB>:GET,POST,PUT,DELETE 一般请求为 GET、提交变更为 POST、上传文件为 PUT、删除操作为 DELETE

<PROTOCOL>:协议,一般为 HTTP 协议

<HOST>:主机,可为主机的 IP 地址或 Hostname

<PORT>:主机端口

<PATH>:路径,主机端口后的路径,如下几个路径:/_cat, /_search, /_cluster /_cat 路径覆盖了大多数的信息内容,/_search 为搜索所有的索引和文档类型

<QUERY_STRING>:查询字符串匹配规则

-d:指定主体内容

<BODY>:json 格式的请求主体

 

Elasticsearch 基本查询语句

//查看 _cat 支持的信息
kibana: GET /_cat
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat’

//查看主节点信息
kibana: GET /_cat/master?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/master?v’

//查看集群所有节点
kibana: GET /_cat/nodes?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/nodes?v’

//查看所有索引信息
kibana: GET /_cat/indices?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/indices?v’

//查看单个索引信息
kibana: GET /_cat/indices/movies?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/indices/movies?v’

//查看所有分片信息
kibana: GET /_cat/shards?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/shards?v’

//查看单个索引分片信息
kibana: GET /_cat/shards/movies?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/shards/movies?v’

//查看集群健康状态
kibana: GET /_cat/health?v
kibana: GET _cluster/health
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/health?v’
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cluster/health?pretty’

//查看插件
kibana: GET /_cat/plugins?v
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/plugins?v’

//查看所有索引文档总数
kibana: GET _all/_count
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_all/_count?pretty’

//查看指定索引文档总数
kibana: GET movies/_count
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/movies/_count?pretty’

//查看所有模板
kibana: GET _cat/templates
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/templates?v’

//查看状态为绿的索引
kibana: GET /_cat/indices?v&health=green
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/indices?v&health=green’

//查看 movies 索引元数据
kibana: GET movies
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/movies?pretty’

//按照文档数量排序索引
kibana: GET _cat/indices?v&s=docs.count:desc
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/indices?v&s=docs.count:desc’

//查看各个索引占用内存大小并进行排序
kibana:
bash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW ‘http://192.168.31.215:9201/_cat/indices?v&h=i,tm&s=tm:desc’

Elasticsearch CURD 语法

 

CURD 请求方式 主体 说明
Create PUT /index/_create/id 指定 Document ID,创建文档,如果 ID 已存在,则失败
Create POST /index/_create/id 指定 Document ID,创建文档,如果 ID 已存在,则失败
Create POST /index/_doc 自动生成 ID,不会重复,重复提交则创建多个文档,文档版本都为 1
Index PUT /index/_doc/id 如果 ID 不存在,则创建新的文档,如果 ID 存在,则删除现有文档后创建新的文档,版本+1,ID 相同
Index POST /index/_doc/id 如果 ID 不存在,则创建新的文档,如果 ID 存在,则删除现有文档后创建新的文档,版本+1,ID 相同
Read GET /index/_doc/id 查看 Document ID 为 1 的文档
Update POST /index/_doc/id 文档必须存在,否则更新失败,只能增量修改字段,不能减少字段,字段值可以随意修改,版本加 1
Delete Delete /index/_doc/id 文档必须存在,否则删除返回”not_found”
Delete Delete /index 删除索引,索引内的文档也会被随之而删除,要删除的索引必须存在,否则返回 “404”

 

Create 创建索引及文档

Create 一个文档时,Elasticsearch支持自动生成文档 ID 和指定文档 ID 两种方式。

1.通过调用 POST /index/_doc 语法,系统自动生成文档 Document ID。此种方法,即使创建的 JSON 文档重复,Document ID 也不一致,如果重复使用 POST 多次提交,Elasticsearch将会创建多个内容重复但 ID 不一致的文档。

2.通过调用 POST /index/_create/id 或 PUT /index/_create/id 语法,则手动指定生成 Document ID,此种方法,如果我们指定 ID 的文档已存在,则创建失败,反正创建文档。

自动生成 Document ID




#Kibana 语法
POST /index/_doc
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}

#Bash 语法
curl -XPOST -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/index/_doc?pretty' -d '
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}

POST 请求指定 Document ID



#Kibana POST 请求语法
POST /index/_create/1
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}

#Bash POST 请求语法
curl -XPOST -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/index/_create/1?pretty' -d '
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}'

 

PUT 请求指定 Document ID


#Kibana PUT 请求语法
PUT /index/_create/1
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}

#Bash PUT 请求语法
curl -XPUT -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/index/_create/1?pretty' -d '
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}'

 

Index 创建索引文档或更新

 

Index 语法可以有两种 HTTP 请求方式,分别是 POST 和 PUT,这种请求方法通过调用 /index/_doc/id 语法,指定了 Document ID 来创建文档,如果 Document ID 不存在,则创建为新的文档,如果 ID 存在,则删除现有 ID 后创建新的文档,Document Version 会进行 + 1。Index 方式的原理是:如果文档已存在,先删除原有文档,然后再进行新增文档,版本+1。


#Kibana 操作
POST /index/_doc/6              #PUT 语法只需要把 POST 改为 PUT 即可
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}

#Bash 操作
curl -XPUT -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/index/_doc/6?pretty' -d '
{
  "name": "WeiLiang Xu",
  "Blogs": "abcops.cn",
  "Is male": true,
  "age": 25
}'

 

Read 查询文档

Read 为读取文档内容,Read 使用的 HTTP 请求方式为 GET ,

#Kibana 操作
GET /index/_doc/1                   #操作 index 索引中 Document ID 为 1 的文档

#Bash 操作
curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/index/_doc/1?pretty'

#更多的 GET 语法见文章顶部

 

Update 更新文档

Update 方法与 Index 不同的是,Update 在更新文档的时候不会删除原来的文档,而是真正的更新数据。Update 更新的文档必须真实存在,Update 更新只能对字段进行增量修改,对字段值可以进行随意更改,不能对文档字段进行减少更新。如果你需要减少字段,则使用 Index 去操作文档。


#Kibana 操作
POST /weiliang/_update/1
{
  "doc": {
  "name": ["weiliang Xu","xueiliang"],
  "JobS": "Linux DevOps",
  "Age": 25,
  "gender": "man"
  }
}

#Bash 操作
curl -XPOST -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/weiliang/_update/1?pretty' -d '
{
  "doc": {
  "name": ["weiliang Xu","xueiliang"],
  "JobS": "Linux DevOps",
  "Age": 25,
  "gender": "man"
  }
}'

 

Delete 删除文档

Delete 可以指定 Document ID 删除文档,也可以直接删除索引,删除索引,索引内的文档都随之被删除。


#Kibana 操作
DELETE /weiliang/_doc/1         #删除指定文档
DELETE /weiliang                #删除索引

#Bash 操作
curl -XDELETE -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/weiliang/_doc/1?pretty'
curl -XDELETE -u elastic:26tBktGolYCyZD2pPISW -H "Content-Type:application/json" 'http://192.168.31.215:9201/weiliang?pretty'

 

Bulk API 批量操作

1.支持在一次 API 调用中,对不同索引进行操作
2.支持四种操作 Index、Create、Update、Delete
3.可以在 URI 中指定 Index,也可以在请求的 Playoad 中进行
4.操作中单条语句操作失败,不会影响后续操作
5.返回结果包含了每一条的执行结果


#Kibana 操作
POST _bulk
{ "create" : { "_index" : "bulk_index", "_id" : "1" } }             //创建了索引为 bulk_index ,id 为 1 的文档              
{ "Job" : "Linux Ops" }                                             //文档内容为字段 "Job" 值 "Linux Ops"
{ "delete" : { "_index" : "bulk_index", "_id" : "2" } }             //删除索引为 bulk_index 中 id 为 2 的文档,因为我们暂时还没有 id 为 2 的文档,所以此次执行返回 not_found,但是不影响后续语句执行
{ "update" : { "_id": "1", "_index" : "bulk_index"  } }             //增量更新了 bulk_index 中 id 为 1 的文档,注意这里的写法是 _id 在前,_index 在后
{ "doc" : {"name" : "xuweiliang"} }                                 
{ "index" : {"_index" : "bulk_index", "_id" : "1" } }               //Index 方式操作了 bulk_index 索引的 id 为 1 的文档,把文档内容改了如下
{ "name" : "xuweiliang" }
{ "create" : { "_index" : "bulk_index", "_id" : "2" } }             //在 bulk_index 索引中 创建了一个 id 为 2 的文档
{ "name" : "xuweiliang" , "Age" : 25 }
{ "delete" : { "_index" : "bulk_index", "_id" : "2" } }             //删除了 bulk_index 索引中 id 为 2 的文档

 

使用 bulk api 批量操作的每条语句都会进行返回结果,如下

Elasticsearch 基本 CURD 操作语法讲解

MGET 批量读取

Elasticsearch中提供了 mget 批量读取的方式,批量操作,减少了网络连接所产生的开销。提高性能


GET _mget
{
  "docs":[                                  //docs 为 mget 格式
    {
      "_index": "bulk_index",               //指定要读取文档的索引
      "_id" : 1                             //指定读取文档的 ID
    },
    {
      "_index": "bulk_index",               //同一索引内的不同 ID 联合读取
      "_id" : 2
    },
    {
      "_index": "index",                    //不同索引中的不同 ID 联合读取
      "_id" : 1
    }
  ]
}

 

结果如下:

Elasticsearch 基本 CURD 操作语法讲解

 

 

 

MSEARCH 批量查询

msearch 全称 Multi Serach API 是一个可以进行条件匹配查询的语法

GET /<index>/_msearch

介绍 mserach 官方解释说从单个 API 中获取多个搜索结果,请求的格式类似于批量 API 格式,并使用换行符分隔的 JSON(NDJSON)格式。最后一行数据必须以换行符 \n 结尾。每个换行符前面都可以有一个回车符 \r。向此端点发送请求时,Content-Type 标头应设置为 application/x-ndjson

路径参数 (可选,字符串)索引名称的逗号分隔列表或通配符表达式,用于限制请求。

请求主体

1.aggregations 聚合 (可选,对象)指定聚合。

2.from 来自 (可选,整数)起始文档偏移量。预设为 0。

3.max_concurrent_searches 同时最多查询 (可选,整数)指定多重搜索 API 将执行的并发搜索的最大数量,此默认值基于数据节点的数量和默认搜索线程池大小。

4.max_concurrent_shard_requests (可选,整数)指定每个子搜索请求将在每个节点上执行的并发分片请求的最大数量。此参数应用于保护单个请求,以防止集群过载(例如,默认请求将命中集群中的所有索引,如果每个节点的分片数量很高,则可能导致分片请求被拒绝)。默认为 5。在某些情况下,并发请求无法实现并行性,因此这种保护将导致性能下降。例如,在仅期望很少数量的并发搜索请求的环境中,可能有助于将该值增加到更大的数目。

5.preference (可选,字符串)指定应该对其执行操作的节点或分片。默认为随机。

6.query (可选,查询对象)使用查询 DSL 定义搜索定义。

7.routing (可选,字符串)以指定的主分片为目标。

8.search_type (可选,字符串)搜索操作的类型。可用选项:

query_then_fetch
dfs_query_then_fetch

9.size (可选,整数)要返回的点击数。默认为 10。

响应正文 responses (数组)包括与原始多重搜索请求中的顺序匹配的每个搜索请求的搜索响应和状态代码。如果特定搜索请求完全失败,error 则将返回带有消息和相应状态代码的对象,代替实际的搜索响应。

实例 标头部分包括要搜索的一个或多个索引,search_type,首选项和路由。该正文包括典型的搜索正文请求(包括查询,聚合,来源,大小等)。


$ cat requests
{"index" : "test", "index"}              
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{"index" : "test", "search_type" : "dfs_query_then_fetch"}
{"query" : {"match_all" : {}}}
{}
{"query" : {"match_all" : {}}}

{"query" : {"match_all" : {}}}
{"search_type" : "dfs_query_then_fetch"}
{"query" : {"match_all" : {}}}

 

常见错误返回

 

问题 原因
无法连接 网络故障或集群挂了
连接无法关闭 网络故障或节点出错
429 集群过于繁忙
4xx 请求体格式错误
500 集群内部错误

来源:马哥 Linux 运维

https://mp.weixin.qq.com/s/qZq_EV9q1LUUzOZeTzhA-g

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...