Elasticsearch7.3文档管理

知识点

读完本文将学会以下技能

  • 新建文档
  • 获取文档
  • 更新文档
  • 删除文档

前置条件

  • 已有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,表示文档不存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值