数据操作
新增记录
向指定的 /Index/Type
发送 PUT
请求,就可以在 Index
里面新增一条记录。比如,向/user/admin
发送请求,就可以新增一条人员记录。
PUT user/admin/1
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}
服务器返回的 JSON 对象,会给出 Index
、Type
、Id
、Version
等信息。
{
"_index": "user",
"_type": "admin",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}
此时我们注意看,我们的请求是user/admin/1
。1
表示这条数据的ID
。当然ID
不一定是数字,可以是任意字符串。每次指定ID
是不是很麻烦?其实我们完全可以让它自动生成,只不过需要把PUT
请求改为POST
请求
POST user/admin
{
"user": "李斯特",
"title": "工程师",
"desc": "数据库管理"
}
服务器照常返回 Index
、Type
、Id
、Version
等信息。此时的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允许在单个步骤中进行多次 create
、 index
、 update
或 delete
请求。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 bodyaction
必须是以下选项之一:
- 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,因为这次不是新建记录