ElasticSearch 文档的添加、获取以及更新

2年前 (2022) 程序员胖胖胖虎阿
242 0 0

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程


ElasticSearch 系列第六篇,和大家聊一聊索引的基本操作,前五篇传送门:

  1. 打算出一个 ElasticSearch 教程,谁赞成,谁反对?
  2. ElasticSearch 从安装开始
  3. ElasticSearch 第三弹,核心概念介绍
  4. ElasticSearch 中的中文分词器该怎么玩?
  5. ElasticSearch 索引基本操作

以下是视频笔记:

6.1 新建文档

首先新建一个索引。

然后向索引中添加一个文档:

PUT blog/_doc/1
{
  "title":"6. ElasticSearch 文档基本操作",
  "date":"2020-11-05",
  "content":"微信公众号**江南一点雨**后台回复 **elasticsearch06** 下载本笔记。首先新建一个索引。"
}

1 表示新建文档的 id。

添加成功后,响应的 json 如下:

{
  "_index" : "blog",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
  • _index 表示文档索引。
  • _type 表示文档的类型。
  • _id 表示文档的 id。
  • _version 表示文档的版本(更新文档,版本会自动加 1,针对一个文档的)。
  • result 表示执行结果。
  • _shards 表示分片信息。
  • _seq_no
    _primary_term 这两个也是版本控制用的(针对当前 index)。

添加成功后,可以查看添加的文档:

ElasticSearch 文档的添加、获取以及更新

当然,添加文档时,也可以不指定 id,此时系统会默认给出一个 id,如果不指定 id,则需要使用 POST 请求,而不能使用 PUT 请求。

POST blog/_doc
{
  "title":"666",
  "date":"2020-11-05",
  "content":"微信公众号**江南一点雨**后台回复 **elasticsearch06** 下载本笔记。首先新建一个索引。"
}

6.2 获取文档

Es 中提供了 GET API 来查看存储在 es 中的文档。使用方式如下:

GET blog/_doc/RuWrl3UByGJWB5WucKtP

上面这个命令表示获取一个 id 为 RuWrl3UByGJWB5WucKtP 的文档。

如果获取不存在的文档,会返回如下信息:

{
  "_index" : "blog",
  "_type" : "_doc",
  "_id" : "2",
  "found" : false
}

如果仅仅只是想探测某一个文档是否存在,可以使用 head 请求:

如果文档不存在,响应如下:

ElasticSearch 文档的添加、获取以及更新

如果文档存在,响应如下:

ElasticSearch 文档的添加、获取以及更新

当然也可以批量获取文档。

GET blog/_mget
{
  "ids":["1","RuWrl3UByGJWB5WucKtP"]
}

这里可能有小伙伴有疑问,GET 请求竟然可以携带请求体?

某些特定的语言,例如 JavaScript 的 HTTP 请求库是不允许 GET 请求有请求体的,实际上在 RFC7231 文档中,并没有规定 GET 请求的请求体该如何处理,这样造成了一定程度的混乱,有的 HTTP 服务器支持 GET 请求携带请求体,有的 HTTP 服务器则不支持。虽然 es 工程师倾向于使用 GET 做查询,但是为了保证兼容性,es 同时也支持使用 POST 查询。例如上面的批量查询案例,也可以使用 POST 请求。

6.3 文档更新

6.3.1 普通更新

注意,文档更新一次,version 就会自增 1。

可以直接更新整个文档:

PUT blog/_doc/RuWrl3UByGJWB5WucKtP
{
  "title":"666"
}

这种方式,更新的文档会覆盖掉原文档。

大多数时候,我们只是想更新文档字段,这个可以通过脚本来实现。

POST blog/_update/1
{
  "script": {
    "lang""painless",
    "source":"ctx._source.title=params.title",
    "params": {
      "title":"666666"
    }
  }
}

更新的请求格式:POST {index}/_update/{id}

在脚本中,lang 表示脚本语言,painless 是 es 内置的一种脚本语言。source 表示具体执行的脚本,ctx 是一个上下文对象,通过 ctx 可以访问到 _source_title 等。

也可以向文档中添加字段:

POST blog/_update/1
{
  "script": {
    "lang""painless",
    "source":"ctx._source.tags=[\"java\",\"php\"]"
  }
}

添加成功后的文档如下:

ElasticSearch 文档的添加、获取以及更新

通过脚本语言,也可以修改数组。例如再增加一个 tag:

POST blog/_update/1
{
  "script":{
    "lang""painless",
    "source":"ctx._source.tags.add(\"js\")"
  }
}

当然,也可以使用 if else 构造稍微复杂一点的逻辑。

POST blog/_update/1
{
  "script": {
    "lang""painless",
    "source""if (ctx._source.tags.contains(\"java\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"
  }
}

6.3.2 查询更新

通过条件查询找到文档,然后再去更新。

例如将 title 中包含 666 的文档的 content 修改为 888。

POST blog/_update_by_query
{
  "script": {
    "source""ctx._source.content=\"888\"",
    "lang""painless"
  },
  "query": {
    "term": {
      "title":"666"
    }
  }
}

今日干货

ElasticSearch 文档的添加、获取以及更新
刚刚发表
查看:
13500
回复:135

公众号后台回复 2TB,免费获取 2TB Java 学习资料。

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年10月28日 下午3:56。
转载请注明:ElasticSearch 文档的添加、获取以及更新 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...