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格式的请求主体

Elasticseearch基本查询语句

//查看_cat支持的信息kibana: GET /_catbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat'
//查看主节点信息kibana: GET /_cat/master?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/master?v'
//查看集群所有节点kibana: GET /_cat/nodes?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/nodes?v'
//查看所有索引信息kibana: GET /_cat/indices?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/indices?v'
//查看单个索引信息kibana: GET /_cat/indices/movies?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/indices/movies?v'
//查看所有分片信息kibana: GET /_cat/shards?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/shards?v'
//查看单个索引分片信息kibana: GET /_cat/shards/movies?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/shards/movies?v'
//查看集群健康状态kibana: GET /_cat/health?vkibana: GET _cluster/healthbash: 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?vbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/plugins?v'
//查看所有索引文档总数kibana: GET _all/_countbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_all/_count?pretty'
//查看指定索引文档总数kibana: GET movies/_countbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/movies/_count?pretty'
//查看所有模板kibana: GET _cat/templatesbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/templates?v'
//查看状态为绿的索引kibana: GET /_cat/indices?v&health=greenbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/_cat/indices?v&health=green'
//查看movies索引元数据kibana: GET moviesbash: curl -XGET -u elastic:26tBktGolYCyZD2pPISW 'http://192.168.31.215:9201/movies?pretty'
//按照文档数量排序索引kibana: GET _cat/indices?v&s=docs.count:descbash: 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/idPUT /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请求方式,分别是 POSTPUT,这种请求方法通过调用 /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.支持四种操作 IndexCreateUpdateDelete3.可以在 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 批量操作的每条语句都会进行返回结果,如下



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 } ]}

结果如下:



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 集群内部错误


上一篇:laravel 使用简介 curd


下一篇:使用 Node, Sequelize, Postgres 和 Docker 搭建 CURD API【译】