知识点
读完本文将学会以下技能
- 新建文档
- 获取文档
- 更新文档
- 删除文档
前置条件
- 已有es7.3环境
本文基于es7.3,有些api在低版本的es中可能不适用 - 已有kibana环境
本文使用libana执行es操作请求,需要提前安装kibana,并会使用kibana中的开发工具
新建文档
API格式
# 指定文档ID创建一个文档,示例1.1
PUT /<index>/_doc/<_id>
# 不指定文档ID创建一个文档,示例1.2
POST /<index>/_doc/
# 指定操作类型为create,默认操作类型为index,区别是当文档文档已存在,create操作会抛出异常,index操作会更新文档
PUT /<index>/_create/<_id>
POST /<index>/_create/<_id>
示例1.1
向user索引添加一个文档ID=1的用户
PUT user/_doc/1
{
"userName":"faith.huan",
"userAge":30,
"birthday":"1988-10-26"
}
# 添加成功返回信息,返回信息中"_id"为1
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
示例1.2
向user索引添加一个用户,不指定文档ID
POST user/_doc
{
"userName":"jack.ma",
"userAge":55,
"birthday":"1964-09-10"
}
创建成功返回信息,不指定文档id时,es会自动生成一个,本例中为JZkXnG0BQI9thz8VgBK_
{
"_index" : "user",
"_type" : "_doc",
"_id" : "JZkXnG0BQI9thz8VgBK_",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
示例1.3
假定已完成示例1中的添加一个文档ID=1的用户
操作,分别使用index,create操作文档ID=1的文档看区别
# create操作
PUT user/_create/1
{
"userName":"faith.huan",
"userAge":30,
"birthday":"1988-10-26"
}
# 返回异常
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, document already exists (current version [1])",
"index_uuid": "uTNhyCsXQHe3KssshJLOSg",
"shard": "0",
"index": "user"
}
],
"type": "version_conflict_engine_exception",
"reason": "[1]: version conflict, document already exists (current version [1])",
"index_uuid": "uTNhyCsXQHe3KssshJLOSg",
"shard": "0",
"index": "user"
},
"status": 409
}
# index操作
PUT user/_doc/1
{
"userName":"faith.huan",
"userAge":30,
"birthday":"1988-10-26"
}
# 返回成功信息,注意此时文档的版本_version已经是2
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
获取文档
API格式
# 根据文档ID获取文档,包含文档属性元字段(_id,_version等)+_source,示例2.1
GET <index>/_doc/<_id>
# 根据文档ID判断文档是否存在,示例2.2
HEAD <index>/_doc/<_id>
# 根据文档ID获取文档_source字段内容,示例2.3
GET <index>/_source/<_id>
示例2.1
分别获取文档ID=1和文档ID=2的文档,查看返回结果
# 获取文档ID=1的文档
GET user/_doc/1
# 返回内容,包含了元字段和_source
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"userName" : "faith.huan",
"userAge" : 30,
"birthday" : "1988-10-26"
}
}
# 获取文档ID=2的文档
GET user/_doc/2
# 返回内容,foun=false表示没有找到文档ID=2的文档
{
"_index" : "user",
"_type" : "_doc",
"_id" : "2",
"found" : false
}
示例2.2
使用HEAD请求判断文档ID=1和文档ID=2的文档是否存在
# 判断文档ID=1的文档是否存在
HEAD user/_doc/1
# 返回信息,200 - OK表示文档存在
200 - OK
# 判断文档ID=2的文档是否存在
HEAD user/_doc/2
# 返回信息,404 - Not Found表示文档不存在
404 - Not Found
示例2.3
只获取文档ID=1的文档的_source字段
GET user/_source/1
# 返回内容,没有包含(_id,_version等字段),只包含了_source字段内容
{
"userName" : "faith.huan",
"userAge" : 30,
"birthday" : "1988-10-26"
}
更新文档
API格式
# 根据ID更新文档,示例3.1,3.2
POST /<index>/_update/<_id>
示例3.1
使用script将文档ID=1的用户的年龄+1
# 查询文档1更新前内容
GET user/_source/1
# 返回,此时年龄=30
{
"userName" : "faith.huan",
"userAge" : 30,
"birthday" : "1988-10-26"
}
# 使用script将年龄+1
POST user/_update/1
{
"script" : {
"source": "ctx._source.userAge += params.count",
"lang": "painless",
"params" : {
"count" : 1
}
}
}
# 更新成功返回内容,"result" : "updated",表示已经更新成功
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 6,
"_primary_term" : 1
}
# 查询文档1更新后内容
GET user/_source/1
# 返回,此时年龄已经从30变成31
{
"userName" : "faith.huan",
"userAge" : 31,
"birthday" : "1988-10-26"
}
示例3.2
给文档ID=1的用户添加一个字段userNameCn,值为郇庆东, 并将年龄改回30
# 查询文档1更新前内容
GET user/_source/1
# 返回,此时没有userNameCn字段
{
"userName" : "faith.huan",
"userAge" : 31,
"birthday" : "1988-10-26"
}
# 更新文档1,添加一个字段userNameCn
POST user/_update/1
{
"doc" : {
"userNameCn": "郇庆东",
"userAge": 30
}
}
# 查询文档1更新后内容
GET user/_source/1
# 返回,此时已成功添加字段userNameCn,且年龄改回了30
{
"userName" : "faith.huan",
"userAge" : 30,
"birthday" : "1988-10-26",
"userNameCn" : "郇庆东"
}
文档删除
API格式
# 根据ID删除文档,示例4.1
DELETE /<index>/_doc/<_id>
示例4.1
删除文档ID=1的文档
# 删除前使用HEAD确认文档是否存在
HEAD user/_doc/1
返回200 - OK,表示文档存在
# 删除文档1
DELETE user/_doc/1
返回内容, "result" : "deleted",表示文档已经删除成功
{
"_index" : "user",
"_type" : "_doc",
"_id" : "1",
"_version" : 6,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 9,
"_primary_term" : 1
}
# 使用HEAD请求确认文档是否还存在
HEAD user/_doc/1
返回404 - Not Found,表示文档不存在