三、入门探索:#
下面的小节中你会看到我使用大量的GET / POST 等等包括什么query。其实你不用诧异为啥整一堆这些东西而不写点代码。
其实这些命令对于ES来说,就像是SQL和MySQL的关系。换句话说,其实你写的代码的底层帮你执行的也是我下面说得的这些命令。所以,别怕麻烦,下面的这些知识点无论如何你都不能直接跨越过去。
3.1、集群的健康状况#
GET /_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 1572595632 16:07:12 elasticsearch yellow 1 1 5 5 0 0 5 0 - 50.0%
解读上面的信息,默认的集群名是elasticsearch
,当前集群的status是yellow
,后续列出来的是集群的分片信息,最后一个active_shards_percent
表示当前集群中仅有一半shard是可用的。
状态:
存在三种状态分别是:red、green、yellow
- green : 表示当前集群所有的节点全部可用。
- yellow: 表示ES中所有的数据都是可以访问的,但是并不是所有的replica shard都是可以使用的(我现在是默认启动一个node,而ES又不允许同一个node的primary shard和replica shard共存,因此我当前的node中仅仅存在5个primary shard,为status为黄色)。
- red: 集群宕机,数据不可访问。
3.2、集群的索引信息#
GET /_cat/indices?v
结果:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open ai_answer_question cl_oJNRPRV-bdBBBLLL05g 5 1 203459 0 172.3mb 172.3mb
显示状态为yellow,表示存在replica shard不可用, 存在5个primary shard,并且每一个primary shard都有一个replica shard , 一共20多万条文档,未删除过文档,文档占用的空间情况为172.3兆。
3.3、创建index#
PUT /customer?pretty
ES 使用的RestfulAPI,新增使用put,这是个很亲民的举动。
3.4、添加 or 修改#
如果是ES中没有过下面的数据则添加进去,如果存在了id=1的元素就修改(全量替换)。
- 格式:
PUT /index/type/id
全量替换时,原来的document是没有被删除的!而是被标记为deleted,被标记成的deleted是不会被检索出来的,当ES中数据越来越多时,才会删除它。
PUT /customer/_doc/1?pretty { "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 }
强制创建,加添_create
或者?op_type=create
。
PUT /customer/_doc/1?op_type=create PUT /customer/_doc/1/_create
- 局部更新(Partial Update)
不指定id则新增document。
POST /customer/_doc?pretty { "name": "Jane Doe" }
指定id则进行doc的局部更新操作。
POST /customer/_doc/1?pretty { "name": "Jane Doe" }
并且POST相对于上面的PUT而言,不论是否存在相同内容的doc,只要不指定id,都会使用一个随机的串当成id,完成doc的插入。
Partial Update先获取document,再将传递过来的field更新进document的json中,将老的doc标记为deleted,再将创建document,相对于全量替换中间会省去两次网络请求
3.5、检索#
格式: GET /index/type/
GET /customer/_doc/1?pretty
响应:
{ "_index": "customer", "_type": "_doc", "_id": "1", "_version": 1, "found": true, "_source": { "name": "John Doe" } }
3.6、删除#
删除一条document。
大部分情况下,原来的document不会被立即删除,而是被标记为deleted,被标记成的deleted是不会被检索出来的,当ES中数据越来越多时,才会删除它。
DELETE /customer/_doc/1
响应:
{ "_index": "customer", "_type": "_doc", "_id": "1", "_version": 2, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }
删除index
DELETE /index1 DELETE /index1,index2 DELETE /index* DELETE /_all 可以在elasticsearch.yml中将下面这个设置置为ture,表示禁止使用 DELETE /_all action.destructive_required_name:true
响应
{ "acknowledged": true }
3.6、更新文档#
上面说了POST关键字,可以实现不指定id就完成document的插入, POST
+ _update
关键字可以实现更新的操作。
POST /customer/_doc/1/_update?pretty { "doc": { "name": "changwu" } }
POST+_update进行更新的动作依然需要指定id, 但是相对于PUT来说,当使用POST进行更新时,id不存在的话会报错,而PUT则会认为这是在新增。
此外: 针对这种更新操作,ES会先删除原来的doc,然后插入这个新的doc。