数据操作

新增记录

向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/user/admin发送请求,就可以新增一条人员记录。

PUT user/admin/1
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}

服务器返回的 JSON 对象,会给出 IndexTypeIdVersion 等信息。

{
  "_index": "user",
  "_type": "admin",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": true
}

此时我们注意看,我们的请求是user/admin/11表示这条数据的ID。当然ID不一定是数字,可以是任意字符串。每次指定ID是不是很麻烦?其实我们完全可以让它自动生成,只不过需要PUT请求改为POST请求

POST user/admin
{
  "user": "李斯特",
  "title": "工程师",
  "desc": "数据库管理"
}

服务器照常返回 IndexTypeIdVersion 等信息。此时的ID就是一个随机字符串

{
  "_index": "user",
  "_type": "admin",
  "_id": "AWJlK3C_5Qwk0J_suzqm",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": true
}

这里需要注意的是,用POST请求,如果Index不存在的话,它会自动新增。所以要注意不要把Index的名字写错了。

批量新增之bulk API

单个单个的新增是否太麻烦,所以人官方也提供了可以的批量操作的 bulk API 。该API允许在单个步骤中进行多次 createindexupdatedelete 请求。
bulk 跟其它请求体格式不太一样,它是这个样子的:

{ action: { metadata }}\n
{ request body        }\n
{ action: { metadata }}\n
{ request body        }\n

这种格式是一个单行有效的JSON格式,通过换行符连接到一起。它需要注意的是

  • 每行一定要以换行符(\n)结尾,包括最后一行。这些换行符被用作一个标记,可以有效分隔行。
  • JSON不能被格式化,否则会对解析造成影响

格式解释:
action/metadata 用来指定哪一个文档(metadata)做什么操作(action)
request body 由文档包含的字段和值组成。它是 index、create、update 操作所必需的。delete操作不需要request body
action 必须是以下选项之一:

  • create:如果文档不存在,那么就创建它。
  • index:创建一个新文档或者替换一个现有的文档。
  • update:部分更新一个文档。
  • delete:删除一个文档。

metadata 则是指定操作文档的 _index_type_id

一个 create 请求长这样:

{"create":{"_index": "user", "_type": "admin","_id":1}}
{"user": "李斯特","title": "工程师","desc": "数据库管理"}

在create请求中,ID是必须的,无法自动生成。而在index请求中,如果指定ID且该ID有对应文档,那么执行替换操作。如果ID没有对应文档,则新增。并且在index请求执行新增操作时,它是可以不指定ID让其自动生成的。

一个完整的bulk请求长这样:

POST _bulk
{"create":{"_index": "user", "_type": "admin","_id":1}}
{"user": "李斯特","title": "工程师","desc": "数据库管理"}
{"index":{"_index": "user", "_type": "admin","_id":1}}
{"user": "李斯特1","title": "工程师","desc": "数据库管理"}
{"index":{"_index": "user", "_type": "admin"}}
{"user": "李斯特2","title": "工程师","desc": "数据库管理"}
{"update":{"_index": "user", "_type": "admin","_id":1}}
{"doc":{"title": "工程师1"}}

注意这里每个action都带了_index 、 _type。每次都写太麻烦,针对同一个index/type我们其实可以这样写

POST user/admin/_bulk
{"create":{"_id":1}}
{"user": "李斯特","title": "工程师","desc": "数据库管理"}
{"index":{"_id":1}}
{"user": "李斯特1","title": "工程师","desc": "数据库管理"}
{"index":{}}
{"user": "李斯特2","title": "工程师","desc": "数据库管理"}
{"update":{"_id":1}}
{"doc":{"title": "工程师1"}}

是不是轻松了许多,当然虽然在请求是确定了index和type,我们仍然可以在具体的action中去覆盖他们,像这样

POST user/admin/_bulk
{"create":{"_id":1}}
{"user": "李斯特","title": "工程师","desc": "数据库管理"}
{"index":{"_id":1}}
{"user": "李斯特1","title": "工程师","desc": "数据库管理"}
{"index":{"_index": "user1", "_type": "admin1"}}
{"user": "李斯特2","title": "工程师","desc": "数据库管理"}
{"update":{"_id":1}}
{"doc":{"title": "工程师1"}}

这里的第二个index请求我们便覆盖了index和type。所以这里会创建新的index:user1以及type:admin1。
最后,bulk请求返回将包含 一个 items 数组(这里就不贴了),这个数组的内容是以请求的顺序列出来的每个请求的结果。所以bulk请求不是原子的,不能用它来实现事务控制 。每个请求是单独处理的,因此一个请求的成功或失败不会影响其他的请求。

查看记录

/Index/Type/Id发出 GET 请求,就可以查看这条记录。

GET user/admin/1

返回的数据中,found字段表示查询成功,_source字段返回原始记录。

{
  "_index": "user",
  "_type": "admin",
  "_id": "1",
  "_version": 3,
  "found": true,
  "_source": {
    "user": "李斯特1",
    "title": "工程师1",
    "desc": "数据库管理"
  }
}

如果 Id 不正确,就查不到数据,found字段就是false。

GET user/admin/2

{
  "_index": "user",
  "_type": "admin",
  "_id": "2",
  "found": false
}

删除记录

删除记录就是发出 DELETE 请求。

DELETE user/admin/1

{
  "found": true,
  "_index": "user",
  "_type": "admin",
  "_id": "1",
  "_version": 4,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  }
}

如果 Id 不正确,found字段就是false。

DELETE user/admin/2

{
  "found": false,
  "_index": "user",
  "_type": "admin",
  "_id": "2",
  "_version": 2,
  "result": "not_found",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  }
}

更新记录

更新记录就是使用 PUT 请求,重新发送一次数据。

PUT user/admin/1
{
  "user": "李斯特",
  "title": "工程师",
  "desc": "数据库管理"
}
返回结果:
{
  "_index": "user",
  "_type": "admin",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": false
}

对比首次添加数据,我们可以发现:

  • 记录的 Id 没变,但是版本(version)从1变成2
  • 操作类型(result)从created变成updated
  • created字段变成false,因为这次不是新建记录