探索你的集群(翻译)
来源:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/getting-started-update-documents.html
支持的API
API可以实现的功能:
1.检测集群、节点、索引健康、状态、统计信息
2.管理集群、节点、索引数据、元数据
3.执行高级查询操作类似:分页、排序、过滤、脚本、聚合和其他
集群健康
请求语句:
curl -X GET "localhost:9200/_cat/health?v&pretty"
返回:
Green:一切正常(集群完全可用)
Yellow:所有数据可用,但是一些副本没有分配完成(集群完全可用)
Red:一些数据不可用,由于一些原因(集群部分可用)
注意:
当集群变红的时候,依然会有一些可用的分片响应查询请求,但是我们应该尽快处理这些未分配的分片
请求语句:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
请求节点状态
列出所有指标
请求语句:
curl -X GET "localhost:9200/_cat/indices?v&pretty"
返回:health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
创建索引
举例:
创建一个名为customer的索引,然后列出所有的索引
curl -X PUT "localhost:9200/customer?pretty&pretty"
curl -X GET "localhost:9200/_cat/indices?v&pretty"
第一行是创建索引,用PUT方法 后缀加了pretty来告诉请求返回json格式的数据(如果有)
返回如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open customer 95SQ4TSUT7mWBT7VNHH67A 5 1 0 0 260b 260b
第二个请求是告诉我们现在有一个索引,并且有五个分片和一个副本,里面没有文档
我们可以注意到这个索引被标注为Yellow的状态,原因是因为我们的集群只有一个节点,
一个副本在只有一个节点的情况下不会被分配,如果再来一个节点可以被分配,然后变成Green的状态
索引和查询一条文档:
更新一条文档到customer索引中:
curl -X PUT "localhost:9200/customer/_doc/1?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
返回如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}综上所述
综上所述,我们可以看到一个新的文档成功写入到customer索引中,他的主键是1
值得注意的是数据在写入的时候不需要事先创建索引,es可以在写入数据的时候自动创建索引
接下来搜索一下刚才写入的数据:
curl -X GET "localhost:9200/customer/_doc/1?pretty&pretty"
返回如下:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : { "name": "John Doe" }
}
这跟写入的Json相比就多了一个found字段,标志我们是否搜索数据成功。_source存储我们事先写入的完整的json
删除索引
删掉刚才建好的数据
curl -X DELETE "localhost:9200/customer?pretty&pretty"
curl -X GET "localhost:9200/_cat/indices?v&pretty"
返回如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
这意味着索引被成功删除,我们又回到了集群开始啥也没有的状态
在继续学习之前,我们来近距离观察一下刚才学的一些API
curl -X PUT "localhost:9200/customer?pretty"
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
curl -X GET "localhost:9200/customer/_doc/1?pretty"
curl -X DELETE "localhost:9200/customer?pretty"
如果我们学的认真的话,我们可以看到请求ES的一种模式,总结如下:
<HTTP Verb> /<Index>/<Type>/<ID>
这个请求模式在所有的API请求中都很普遍,如果你能记住它,就是在学习管理ES中起了个好头。
更改你的数据
es具有近实时的数据操作和搜索能力,默认情况下,你可以假设有1s的延时,操作情况:index/update/delete
这是跟其他类似SQL这种操作之后就马上更新数据的平台的一个重要区别
建立/替换文档:
前面我们知道了如何插入一条数据,回顾一下:
curl -X PUT "localhost:9200/customer/_doc/1?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
上面的操作可以向customer索引中写入一条特定数据,主键是1,如果我们再执行一次上面的命令,es会替换一条新的文档到旧的文档中,主键还是1
主键一致的情况下 内容会变化,主键是新的会生成新的数据
当写入数据的时候,你可以指定主键,如果不指定,es就随机生成一个主键,请求的结果中会返回这个主键。
下面示例一下如何不指定主键写入数据:
curl -X POST "localhost:9200/customer/_doc?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"name": "Jane Doe"
}
'
注意以上的示例中,我们采用的是POST方法而不是PUT方法,在我们不指定主键的情况下。
更新数据:
除了能写入和替换文档之外,我们还需要更新文档,注意es的底层机制并不真正的更新文档,当我们更新数据的时候,
es会删除旧的数据,然后写入一条新的数据。
下面这个是更新示例:
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"doc": { "name": "Jane Doe" }
}
'
这个示例表示了我们如何更新一个之前已有的主键是1的数据,将名字改了一下,还可以再加一个字段:
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"doc": { "name": "Jane Doe", "age": 20 }
}
'
更新数据还可以用script方法,下面的示例是将age+5
curl -X POST "localhost:9200/customer/_doc/1/_update?pretty&pretty" -H 'Content-Type: application/json' -d'
{
"script" : "ctx._source.age += 5"
}
'
在上面的示例中。ctx._source这个方法表示了当前的source文档将被更新。
es提供了同时更新多个文档的功能通过查询条件,类似SQL查询 update-where 参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docs-update-by-query.html
删除数据:
删除数据非常的直接,下面的这个示例展示了如何删除一个提前创建好的主键是2的数据
curl -X DELETE "localhost:9200/customer/_doc/2?pretty&pretty"
删除也可以用查询批量删除(delete_by_query API)删除符合条件的数据
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docs-delete-by-query.html
也可以采用下面方式删除:curl -XDELETE 'http://localhost:9200/index_name/_query?pretty' -d '{"query": {"bool": {"must":[{"range":{"modify_time":{"to":1562342400}}}]}}}'
删除后附加查询条件
批量处理:
除了能写入,更新和删除个别数据之外,es还提供了_bulk API来批量操作,
这个功能很重要,因为他提供了高效的机制来进行多种操作,尽可能快与少的网络消耗来操作。
提供一个快速的例子,在Bulk操作中写入两条数据:
curl -X POST "localhost:9200/customer/_doc/_bulk?pretty&pretty" -H 'Content-Type: application/json' -d'
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'
这个是更新一个与删除一个的bulk操作:
curl -X POST "localhost:9200/customer/_doc/_bulk?pretty&pretty" -H 'Content-Type: application/json' -d'
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'
注意上面的删除操作没有额外的文档输入,删除只需要主键
Bulk API不会因为批量操作中的一次操作而失败,如果一条操作因为一些原因失败了,它之后的数据依然会继续处理,
bulkAPI的返回操作中会提供每条数据的操作返回状态,这样就可以检查某些失败的特定数据。