探索你的集群(翻译)

来源: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的返回操作中会提供每条数据的操作返回状态,这样就可以检查某些失败的特定数据。

原文地址:https://www.cnblogs.com/supermanwx/p/11843865.html