ES文档:文档操作_doc(7.9.2)

举报
不惑 发表于 2024/10/29 09:29:49 2024/10/29
【摘要】 ElasticSearch文档的操作

ElasticSearch文档的操作;

添加文档

新建一个索引 goboy-blog,如果添加文档索引不存在则会创建一个索引。

PUT goboy-blog/_doc/1
{
  "title":"我的第一个文档",
  "data":"2023-11-2",
  "content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}

image.png

Elasticsearch文档索引的响应示例,包含了以下关键信息:

"_index": 这是文档所属的索引的名称,这里是"goboy-blog"。
"_type": 在Elasticsearch 7.x版本之后,通常为"_doc",表示默认文档类型。
"_id": 这是文档的唯一标识符,用于在索引中唯一标识文档。在这里,文档的ID是"1"。
"_version": 这是文档的版本号,表示文档的版本。在这里,文档的版本号是1。
"result": 这是文档索引操作的结果,这里是"created",表示文档已经成功创建。
"_shards": 这是关于文档索引操作的分片信息。
"total": 这是总分片数量,这里是2。
"successful": 这是成功索引的分片数量,这里是1。这表示在2个分片中的1个成功索引。
"failed": 这是失败的分片数量,这里是0。表示没有分片索引操作失败。
"_seq_no": 这是文档的序列号,用于跟踪文档的变化。
"_primary_term": 这是文档所在的主分片的主要期(primary term)。

这个响应表明文档成功地被索引到了"goboy-blog"索引中,索引操作是成功的,只有一个分片成功地完成了索引操作。索引操作通常用于将文档添加到Elasticsearch索引中,以便后续搜索和检索。

知识点!!!

  • 使用PUT请求添加文档时必须携带文档id,否则会出错
  • 使用POST请求添加文档可以不携带文档id,会自动创建一个文档id
POST goboy-blog/_doc
{
  "title":"我的第二个文档",
  "data":"2023-11-2",
  "content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}

image.png

查找文档

GET goboy-blog/_doc/2
  • 获取编号(ID)为2的文档:

image.png

Elasticsearch文档检索的响应示例,包含了以下关键信息:

"_index": 这是文档所属的索引的名称,这里是"goboy-blog"。
"_type": 在Elasticsearch 7.x版本之后,通常为"_doc",表示默认文档类型。
"_id": 这是文档的唯一标识符,用于在索引中唯一标识文档。在这里,文档的ID是"2"。
"found": 这是一个布尔值,表示是否找到了文档。在这里,值为false,表示未找到ID为"2"的文档。

这个响应表明尝试检索ID为"2"的文档,但未找到该文档,因此found字段的值为false。文档检索操作通常用于从索引中检索文档,如果文档存在,则会返回文档的详细信息,如果文档不存在,则会返回found字段为false

GET goboy-blog/_doc/1

image.png

查看索引中所有文档内容

GET goboy-blog/_search

image.png

判断文档是否存在

根据id判断指定文档是否存在

Head goboy-blog/_doc/1

image.png

Head goboy-blog/_doc/2

image.png

批量获取文档

  • 获取goboy-blog索引中编号为1和2的文档
GET goboy-blog/_mget
{
  "ids":["1","2"]
}

image.png

这里直接用POST请求批量查询比较好的。

POST goboy-blog/_mget
{
  "ids":["1","2"]
}

文档更新

普通更新(根据id)

PUT goboy-blog/_doc/1
{
  "title":"更新我的第一个文档"
}

文档更新一次,_version 就会加1;

更新某个字段的值会覆盖整个文档:

image.png

 GET goboy-blog/_doc/1

通过查询发现,字段已经被覆盖
image.png

大多数时候我们只需要更新某一个字段的值,所以我们采取以下方式:

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

POST goboy-blog/_update/1
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.title=params.title",
    "params": {
      "title":"更新我的第一个文档"
    }
  }
}

image.png

查看
image.png

Elasticsearch的更新请求,它试图更新索引中的文档。让我来解释这个请求的各个部分:

POST goboy-blog/_update/2: 这是HTTP请求,用于更新索引中的文档。以下是各个部分的解释:
goboy-blog: 这是索引的名称,表示要对"goboy-blog"索引进行操作。
_update: 这是Elasticsearch的更新操作,用于部分更新文档。
2: 这是文档的唯一标识符(ID),表示要更新的文档的ID。在这里,文档的ID是"2"。
"script": 这是更新文档时使用的脚本。
"lang": 这是脚本语言,这里是"Painless",一种用于Elasticsearch的脚本语言。
"source": 这是脚本的源代码,指定了要执行的脚本逻辑。脚本的作用是将文档中的"title"字段更新为"我是一个标题"。
"params": 这是脚本参数,允许将参数传递给脚本。在这里,参数"title"被设置为"我是一个标题"。

这个请求的目的是将ID为"2"的文档中的"title"字段更新为"我是一个标题"。更新请求中的脚本部分使用Painless脚本语言来执行更新操作。请注意,这是一个示例请求,实际应用中需要根据具体需求和文档结构来编写更新请求。

添加字段

  • 增加一个文档的字段tags并为其赋值
  • 增加tags标签并为其赋值 java,js
PUT goboy-blog/_doc/2
{
  "title":"我的第二个文档",
  "data":"2023-11-2",
  "content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}

image.png

POST goboy-blog/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.tags=[\"java\",\"js\"]"
  }
}

image.png

  • 获取文档内容:
    image.png

  • 使用add方法为tags标签添加一个元素css

POST goboy-blog/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.tags.add(\"css\")"
  }
}

image.png

  • 再次获取文档内容:
    image.png

  • 也可以使用一些复杂的 if-else逻辑

  • 如果文档中的tags标签包含css内容,则删除此文档,否则什么都不做


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

image.png

  • 查询
    image.png

查询更新

  • 当前数据
    image.png

通过条件查询找到文档,然后进行更新

例如:将title包含“更新”的文档的content修改为“非常非常的走心”。

  • 文档内容:
POST goboy-blog/_update_by_query
{
  "script": {
    "source": "ctx._source.content=\"非常非常的走心\"",
    "lang": "painless"
  },
  "query": {
    "term": {
        "title": "666"
    }
  }
}
  • 更新结果:
    image.png
    image.png

Elasticsearch批量操作的响应示例,包含了有关操作执行的各种统计信息和指标。以下是响应中各个字段的解释:

"took": 表示操作花费的时间,这里是6毫秒。
"timed_out": 是一个布尔值,表示操作是否超时,这里是false,表示操作未超时。
"total": 表示操作涉及的文档总数,这里是1,表示有1个文档被操作。
"updated": 表示已经更新的文档数量,这里是1,表示1个文档被更新。
"deleted": 表示已经删除的文档数量,这里是0,表示没有文档被删除。
"batches": 表示操作执行的批次数量,这里是1,表示有1个批次的操作。
"version_conflicts": 表示发生版本冲突的文档数量,这里是0,表示没有版本冲突。
"noops": 表示没有实际操作的文档数量,这里是0,表示所有操作都是有效的。
"retries": 包含了重试操作的信息,分为bulk(批量操作)和search(搜索操作)两种类型,这里都是0,表示没有重试操作。
"throttled_millis": 表示操作由于限流而被暂停的时间,这里是0毫秒,表示没有限流暂停。
"requests_per_second": 表示每秒执行的操作请求数,这里是-1.0,表示没有限制。
"throttled_until_millis": 表示限流操作将持续暂停的时间,这里是0毫秒,表示没有限流。
"failures": 包含了有关操作中发生的错误的详细信息,这里是一个空数组,表示没有错误。

这个响应表明执行的操作更新了1个文档,操作总数为1,没有发生错误或冲突。通常,这种情况表示操作成功,并且已经更新了指定文档。

删除文档

根据id删除

语法:DELETE {index}/_doc/{id}

删除一个id为 VF9xiosBWWxO5_dDHEpm 的文档

DELETE goboy-blog/_doc/VF9xiosBWWxO5_dDHEpm

image.png

如果在添加文档时指定了路由,则删除文档时也需要指定路由,否则删除失败。

查询删除

查询删除是 POST 请求。

语法:POST {index}/_delete_by_query

例如:删除 title 中包含 666 的文档:

POST goboy-blog/_delete_by_query
{
  "query":{
    "term":{
      "title":"666"
    }
  }
}

image.png
image.png

删除某一个索引下的所有文档:

POST goboy-blog/_delete_by_query
{
  "query":{
    "match_all":{}
  }
}

image.png

  • 查询
    image.png

批量操作

通过 API 可以执行批量索引、批量删除、批量更新等操作。

搞一个名为 goboy.json 的文件,内容如下:

{"index":{"_index":"goboy","_id":"123"}}
{"name":"Javaboy"}
{"update":{"_index":"goboy","_id":"123"}}
{"doc":{"name":"C++boy"}}

第一行:index 表示要执行一个索引操作(这个表示一个 action,其他的 action 还有 create,delete,update)。

  • _index 定义了索引名称,这里表示要创建一个名为 goboy的索引;
  • _id 表示新建文档的 id 为 123;

第二行是第一行操作的参数。

第三行的 update 则表示要更新。

第四行是第三行的参数。

注意!!!,结尾要空出一行。

goboy.json 文件创建成功后,放到服务器的某个目录下,执行请求命令,如下:

curl -XPOST "http://localhost:9200/goboy/_bulk" -H "content-type:application/json" --data-binary @/opt/goboy.json

执行完成后,就会创建一个名为 goboy的索引了,同时向该索引中添加一条记录,再修改该记录;

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。