Elasticsearch-文档的 CRUD

本文介绍文档的 CRUD 操作以及文档的元信息、文档的批量操作以及 REST API 一些常见的返回码。

文档的 CRUD

CRUD 指的是在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写。crud主要被用在描述软件系统中数据库或者持久层的基本操作功能。

操作预览

操作

HTTP 请求

Index

PUT my_index/_doc/1 { "user":"mike", "commnet":"You Know,for search" }【Type 名称在7.0之后约定都使用 _doc】

Create

PUT my_index/_create/2 { "user":"mike", "comment":"You Know,for search" } POST my_index/_doc { "user": "Simon", "comment":"You know,for search" }

Read

GET my_index/_doc/2

Update

POST my_index/_update/1 { "doc": { "user":"mike", "comment":"You know,Elasticsearch" } }

Delete

DELETE my_index/_doc/1

创建文档

PUT users/\_create/1



{



  "firstName":"Jack",



  "lastName":"Johnson",



  "tags":["guitar","skateboard"]



}
  • 文档 ID 支持自动生成和指定文档 ID 两种方式。通过调用 post /users/\_doc 系统会自动生成 document id
  • 使用 HTTP PUT users/_create/1创建文档时,URI 中显式指定 \_create ,此时如果该 id 的文档已存在,则操作失败

Index 和 Create的区别

Index不同于 create的地方是,如果文档不存在,就索引新的文档,否则如果文档存在,那么现有文档会被删除,新的文档被索引,版本信息+1。

PUT users/_doc/1

{

  "tags":["guitar","skateboard","reading"]

}



GET users/_doc/1



{

  "_index" : "users",

  "_type" : "_doc",

  "_id" : "1",

  "_version" : 2,

  "_seq_no" : 1,

  "_primary_term" : 1,

  "found" : true,

  "_source" : {

    "tags" : [

      "guitar",

      "skateboard",

      "reading"

    ]

  }

}

获取文档

获取文档使用 HTTP 的 GET 方法,指明索引名称/_doc(type)/文档 ID。

GET users/_doc/1



{

    //-----文档元数据部分开始-----

  "_index" : "users",

  "_type" : "_doc",

  "_id" : "1",

  "_version" : 1, //每发生一次修改,版本号+1

  "_seq\_no" : 0,

  "_primary_term" : 1,

  //-----文档元数据部分结束-----

  "found" : true,

  //-----文档原始信息开始-----

  "_source" : {

    "firstName" : "Jack",

    "lastName" : "Johnson",

    "tags" : [

      "guitar",

      "skateboard"

    ]

  }

  //-----文档原始信息结束-----

}

关于版本信息,即使文档被删除,Version 号也会不断增加。 _source 中默认包含了文档的所有原始信息。找不到的文档返回 HTTP 404。

修改文档

Update 方法不会删除原有的文档,POST 方法需要包含在“doc”中。

POST users/_update/1

{

  "doc": {

    "albums":["Album1","Album2"]

  }

}

CRUD示例

CRUD 示例

Bulk API

Elasticsearch 提供 Bulk API 支持一次 REST API 调用中,对不同的索引进行操作。支持的操作有:

  • Index
  • Create
  • Update
  • Delete

可以在 URI 中指定 Index 也可以在请求的 Payload 中指定。操作中单条操作失败,并不影响其他操作。返回结果包括了每一条操作执行的结果。

POST _bulk

{ "index" : { "_index" : "test1","_id": "1" } }

{ "field1" : "value1" }

{ "delete" : { "_index" : "test","_id" : "2"} }

{ "create" : { "_index" : "test2","_id" : "3" } }

{ "field1" : "value3" }

{ "update" : { "_id":"1","_index":"test"} }

{ "doc" : { "field2": "value2"} }
bulk API

批量读取 mget

批量操作可以减少网络连接所产生的开销,,提高程序的性能。

GET _mget

{

  "docs":[

    {

      "_index": "user",

      "_id":1

    },

    {

      "_index": "comment",

      "_id":1

    }

    ]

}

------

GET \_mget

{

  "docs":[

    {

      "_index": "test1",

      "_id":1

    },

    {

      "_index": "test",

      "_id":2

    }

    ]

}
mget

批量查询 msearch

POST kibana_sample_data_ecommerce/_msearch

{}

{"query": {"match\_all":{}},"size":1}

{"index": "kibana_sample_data_flights"}

{"query": {"match_all": {}},"size":2}

API 常见的错误返回

问题现象

原因

无法连接

网络故障或集群故障

连接无法关闭

网络故障或节点繁忙

429

集群过于繁忙

4XX

请求体格式错误

500

集群内部错误

总结

  1. 文档的 CRUD操作
  2. 每个文档都有一个版本号,可用于并发控制,避免冲突
  3. _mget和 bulk API 可以减少建立网络连接所产生的开销
  4. bulk API 每行需要指定 index 信息,也可以在 URI 中指定,从 ES 7开始,不需要指定 type
  5. 单词批量操作,数据量不宜过大,以避免引发性能问题

本文相关文件

CRUD 示例

GET _cat/indices



DELETE users



//create document,自动生成_id

POST users/_doc

{

  "user":"Mike",

    "post_date":"2019-08-14T14:12:12",

    "message": "trying out Kibana"

}



//cerate document,指定 id。如果 ID 存在,报错

//第一次执行此命令成功,第二次失败

PUT users/_doc/1?op_type=create

{

  "user":"Jack",

  "post_date":"2019-08-14T14:14:12",

  "message":"trying out Elasticsearch"

}



//通过文档 ID 获取文档信息

GET users/_doc/1



//index 创建文档,当前文档ID 为 1 已存在

//结果是原文档被删除,当前文档的版本号在之前的版本号上+1

PUT users/_doc/1

{

  "user":"Mike"

}



//在原文档上增加字段

POST users/_update/1/

{

  "doc":{

    "post_date":"2019-08-14T15:57:12",

    "message": "trying out Elasticsearch"

  }

}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券