Elasticsearch 7.x 深入【3】文档的增删改

1. 借鉴

极客时间 阮一鸣老师的Elasticsearch核心技术与实战

2. 开始

2.1 crud

对于一个名为hotel_search的索引,我们可以做一下操作

序号 操作 示例 释义
1 index                               PUT /hotel_search/_doc/1
{"name": "靓丽酒店","salas": 100}                                                                  
如果文档不存在会创建新文档;如果存在文档,会先删除现有文档,再创建新文档,版本号会增加

可选参数与:op_type: 在提交请求时指定op_type=create, 表示若id不存在时创建, 否则失败[PUT /hotel_search/_doc/1?op_type=create]
2 create PUT /hotel_search/_create/1
{"name": "靓丽酒店1","salas": 100}

POST /hotel_search/_doc
{"name": "靓丽酒店10086","salas": 100}
有两种创建文档的方式:
第1种:通过“PUT /indexName/_create/ID”创建,URI需要指定_create,如果文档存在会创建失败

第2种:通过“POST /indexName/_doc” 会自动生成ID
3 get GET /hotel_search/_doc 获取指定ID的文档
4 update POST /hotel_search/_update/1
{ "doc": { "name": "靓丽酒店" } }
文档已经存在,更新只会对相应字段做增量修改
5 delete DELETE /hotel_search/_doc/1 删除指定ID的文档

PUT index和PUT create的区别:如果文档不存在,就索引新的文档,否则会先删除现有文档,再创建新文档,版本号会增加

2.2 bulk api

支持在一次API中,对不同索引进行操作

  • 支持index,create,update,delete四种类型的操作
  • 可以指定不同的index
  • 操作中单条数据操作失败,不影响其他操作
  • 返回结果包括每一条啊执行的结果

栗子

PUT /_bulk
{ "index": { "_index": "hotel_search", "_id": 1}}
{ "name": "靓丽酒店" }
{"delete": {"_index": "hotel_search_v1", "_id": 2}}
{"create": { "_index": "hotel_search", "_id": 3}}
{ "name": "草莓酒店" }
{ "update": { "_id": "1", "_index": "hotel_search"} }
{ "doc": { "name": "青春酒店" }}

2.3 mget

批量操作

  • 栗子
GET _mget
{
  "docs": [
    {
      "_index": "hotel_search",
      "_id": 1
    },
    {
      "_index": "hotel_search",
      "_id": 2
    }
    ]
}

2.4 msearch

批量查询

  • 栗子
GET /hotel_search/_msearch
{}
{"query": {"match_all":{}}, "from": 0, "size": 10 }
{}
{"query": {"match_all":{}}}
{"index": "movies"}
{"query": { "match_all":{}}}

2.5 _mget 和 _msearch有啥区别呢?

_mget 是通过文档ID列表得到文档信息。_msearch 是根据查询条件,搜索到相应文档。

2.5 精选留言

以下这段话摘自课程留言,非本人所属,只是觉得挺好的,所以粘过来了,道声感谢

我觉得对于ES的POST、PUT请求可以这么按照http请求的“幂等性”来理解。
https://blog.csdn.net/u010651249/article/details/84350061。
PUT方法要求是幂等的,POST方式不是幂等的,POST方法修改资源状态时,URL指示的是该资源的父级资源,待修改资源的信息在请求体中携带。而PUT方法修改资源状态时,URL直接指示待修改资源。
所以,对于ES的PUT请求,URL上需要明确到document ID,即可以新增又可以更新整个文档(ES的更新都是get-有就delete-再创建),但无论如何都是这一个document。由于PUT请求既可以新增又可以更新的特性,为了提供put-if-absent特性,即没有时才新增,增加了op_type=create的选项(op_type只有create、index)。
而POST请求URL是不需要指定ID的,每次都会创建一个新的文档,就不是幂等的。
(其实PUT请求执行的操作,把PUT换成POST也是可以的,但这个官方没有说,是实验出来的)

上面是根据Http请求来区分,如果根据ES API来区分:
index: 针对整个文档,既可以新增又可以更新;
create:只是新增操作,已有报错,可以用PUT指定ID,或POST不指定ID;
update:指的是部分更新,官方只是说用POST,请求body里用script或 doc里包含文档要更新的部分;
delete和read:就是delete和get请求了,比较简单。

3. 大功告成

你可能感兴趣的:(Elasticsearch 7.x 深入【3】文档的增删改)