大家好,我是Edison。

上一篇:ES必备基础概念一览

ES文档CRUD介绍

和MongoDB一样,文档的CRUD是我们学习ES的必备操作,下图展示了ES文档的CRUD概要:

从上图可以知道,ES文档除了CRUD外,还多了一个Index操作,它的功能Create类似,但又有点不同:

  • Create - 如果ID存在,则会失败;否则新增成功;

  • Index - 如果ID存在,会先删除现有文档再创建新的,版本号会增加;否则,直接新增成功;

因此,我们可以说Index的功能或许可以叫 AddOrReplace。

Create文档

Create文档支持生成文档ID 和 指定文档ID 两种方式:

自动生成ID

通过调用 post {index}/_doc,系统会自动生成文档ID。

由上图可知,系统自动生成了一个ID。

指定ID

通过调用 put {index}/_create/1,系统会指定新生成文档ID为1。但如果指定ID已经存在,操作则失败。

由上图可知,我们传了一个指定ID=1。但是,如果我们再次执行这条语句会如何?

再次执行会报错,因为ES检测到这个数据版本已经存在了。

Get文档

通过get {index}/_doc/{id}即可快速查询一个文档数据,如果没有找到,则返回HTTP 404。

在返回的文档中,文档的真正内容在_source字段里面。

在返回的文档中,还包含了文档元信息:

  • _index / _type

  • 版本信息,同一个ID的文档,即使被删除,version号也会不断增加

  • _source中默认包含了文档的所有原始信息

Index文档

刚刚提到,Index 和 Create 不一样的地方在于:

  • 如果文档不存在,就索引新的文档。

  • 如果文档已存在,旧文档会先被删除,新文档会被索引,同时版本号+1。

因此,Index操作更像是我们所说的“AddOrReplace”。

通过put {index}/_doc/{id}即可完成Index操作,这里我们以刚刚get的示例为基础,修改id=1的user的username,由于id=1记录已存在,会先删除旧文档,再索引新文档:

从上图可以看到,当Index操作完成后,version号从1变为了2。

这时如果我们再查询一个id=1的文档,会发现已被新文档覆盖了,只有一个user字段了。

Update文档

Update方法就是真正的数据更新,它不会删除原来的文档。

通过post {index}/_update/{id}即可实现Update操作。

这时我们再次get一下,得到的结果:

可以看到,新增的数据已经加入了文档内容中,并且version又增加了一位。

Delete文档

可以通过 delete {index}/_doc/{id}来完成文档的删除操作。

可以看到,返回的结果状态显示为deleted,则表示删除成功。

这时如果再次查询这个文档,就会显示找不到了:

批量操作API(Bulk API)

ES提供了一个Bulk API,支持在一次API调用中,对不同的索引进行不同类型(如Index、Create、Update、Delete)的操作,可以有效减少网络连接所产生的开销。

POST _bulk
{ "index": { "_index":"test", "_id":"1" } }
{ "filed1": "value1" }
{ "delete": { "_index":"test", "_id":"2" } }
{ "create": { "_index":"test2", "_id":"3" } }
{ "filed1": "value3" }
{ "update": { "_index":"test", "_id":"1" } }
{ "doc": { "field2":"value2" } }

其返回结果包含了每一条操作执行的结果。

{
"took" : 854,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
{
"delete" : {
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "not_found",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1,
"status" : 404
}
},
{
"create" : {
"_index" : "test2",
"_type" : "_doc",
"_id" : "3",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1,
"status" : 201
}
},
{
"update" : {
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1,
"status" : 200
}
}
]
}

需要注意的是:操作中单条操作失败,并不影响其他操作。此外,单次批量操作,数据量不宜过大,以免引发性能问题。

批量读取(mget)

和批量操作类似,ES提供了一个mget实现批量读取,可以减少网络连接产生的开销,提高读取的性能。

通过 get /_mget即可完成:

GET /_mget
{
"docs":[
{
"_index":"users",
"_id":1
},
{
"_index":"users",
"_id":2
}
]
}

返回结果包含了多个数据:

{
"docs" : [
{
"_index" : "users",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 5,
"_primary_term" : 1,
"found" : true,
"_source" : {
"user" : "Andy",
"postDate" : "2024-01-20T15:00:00",
"message" : "Trying to use ElasticSearch"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"_seq_no" : 6,
"_primary_term" : 1,
"found" : true,
"_source" : {
"user" : "Wings",
"postDate" : "2024-01-20T15:00:00",
"message" : "Trying to use EFK"
}
}
]
}

批量查询(msearch)

和批量读取类似,ES提供了一个msearch实现批量查询,通过post {index}/_msearch即可完成:

POST users/_msearch
{}
{"query":{"match_all":{}},"size":3}
{"index":"movies"}
{"query":{"match_all":{}},"size":2}

例如上面这个批量查询,它从users中查询了3个数据 还从 movices中查询了2个数据出来:

{
"took" : 7,
"responses" : [
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "users",
"_type" : "_doc",
"_id" : "5-46K40BoVgALGyCI5vL",
"_score" : 1.0,
"_source" : {
"user" : "Edison",
"postDate" : "2024-01-20T14:00:00",
"message" : "Trying to use Kibana"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "Andy",
"postDate" : "2024-01-20T15:00:00",
"message" : "Trying to use ElasticSearch"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"user" : "Wings",
"postDate" : "2024-01-20T15:00:00",
"message" : "Trying to use EFK"
}
}
]
},
"status" : 200
},
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 9743,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "3687",
"_score" : 1.0,
"_source" : {
"year" : 0,
"@version" : "1",
"title" : "Light Years",
"id" : "3687",
"genre" : [
"Adventure",
"Animation",
"Fantasy",
"Sci-Fi"
]
}
},
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "3688",
"_score" : 1.0,
"_source" : {
"year" : 1982,
"@version" : "1",
"title" : "Porky's",
"id" : "3688",
"genre" : [
"Comedy"
]
}
}
]
},
"status" : 200
}
]
}

常见错误返回

ES的一些常见错误返回的表格,供我们学习参考。

小结

本篇,我们了解了ElasticSearch的一些必备基础概念,如索引、文档、集群、节点、分片与副本等。有了这些基本概念,我们可以知道ElasticSearch和关系型数据库的差别。

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Elastic学习之旅 (4) ES文档CRUD操作的更多相关文章

  1. MongoDB快速入门学习笔记3 MongoDB的文档插入操作

    1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有“_id”,如果没有会自动生成.shell操作有insert和save两种方法.当插入一条数据有“_id”值 ...

  2. ElasticSearch基础+文档CRUD操作

    本篇博客是上一篇的延续,主要用来将年前学习ES的知识点做一个回顾,方便日后进行复习和汇总!因为近期项目中使用ES出现了点小问题,因此在这里做一个详细的汇总! [01]全文检索和Lucene (1)全文 ...

  3. Linux学习之旅(二)Linux文档操作

    目录操作 1. 创建目录 // 目录可以是绝对路径,也可以是相对路径 mkdir 目录名 //创建一个目录 mkdir -p 目录名1/目录名1/... //一次性创建多级目录 2. 删除目录 // ...

  4. MongoDB快速入门学习笔记6 MongoDB的文档删除操作

    db.集合名称.remove({query}, justOne)query:过滤条件,可选justOne:是否只删除查询到的第一条数据,值为true或者1时,只删除一条数据,默认为false,可选. ...

  5. MongoDB快速入门学习笔记5 MongoDB的文档修改操作

    db.集合名称.update({query},{update},upsert, multi})query:过滤条件update:修改内容upsert:如果不存在查询条件查出的记录,是否插入一条数据,默 ...

  6. MongoDB快速入门学习笔记4 MongoDB的文档查询操作

    先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, " ...

  7. ES 文档与索引介绍

    在之前的文章中,介绍了 ES 整体的架构和内容,这篇主要针对 ES 最小的存储单位 - 文档以及由文档组成的索引进行详细介绍. 会涉及到如下的内容: 文档的 CURD 操作. Dynamic Mapp ...

  8. 第3章 ES文档和故障处理

    第3章 ES文档和故障处理 一.ES网络配置表 ES网络配置表是ES的硬件和软件组成的列表.ES网络配置常包括以下项目: 分级 项目 杂项信息 系统名.系统厂商/型号.CPU速率.RAM.存储器.系统 ...

  9. SpringBoot学习笔记:Swagger实现文档管理

    SpringBoot学习笔记:Swagger实现文档管理 Swagger Swagger是一个规范且完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.Swagger的目标是对RE ...

  10. MongoDB学习笔记:文档Crud Shell

    MongoDB学习笔记:文档Crud Shell   文档插入 一.插入语法 db.collection.insertOne() 将单个文档插入到集合中.db.collection.insertMan ...

随机推荐

  1. HashMap-线程不安全的原因

    前言 HashMap线程安全的问题,在各大面试中都会被问到,属于常考热点题目.虽然大部分读者都了解它不是线程安全的,但是再深入一些,问它为什么不是线程安全的,仔细说说原理,用图画出一种非线程安全的情况 ...

  2. 【集合分组利器】Java通用集合分组方案

    Java通用集合分组实现方案详解:从基础到高级实践 在Java开发中,对集合中的元素按照特定属性进行分组是一项常见而重要的操作.本文将全面介绍Java中实现集合分组的多种方案,从基础实现到高级用法,并 ...

  3. Dubbo 中的集群容错

    前言 在微服务架构中,服务间的依赖关系复杂且动态,任何一个服务的故障都可能引发连锁反应,导致系统雪崩.一个好的容错设计可以避免这些问题发生: 服务雪崩效应:单个服务崩溃或响应延迟可能导致调用链上的所有 ...

  4. B站,首战告捷!

    大家好,我叫良许,本来是一名写代码的博主,万万没想到,我居然我会放下脸皮在B站当UP主,还全程露脸不戴口罩! 到目前为止,已经拥有 1.1 万粉丝啦~ 我是从去年12月中旬开始正式进驻B站,但是,因为 ...

  5. 0x01 基础算法

    目录 基础算法 排序 快速排序 归并排序 二分 整数二分 浮点数二分 高精度 输入输出 高精度加法 高精度减法 高精度乘法 高精度除法 前缀和 差分 双指针算法 位运算 离散化 区间合并 基础算法 排 ...

  6. 能详细地讲讲stm32该怎么学吗?

    作为一个在嵌入式领域摸爬滚打了好几年的老兵,我想分享一下我学习STM32的心路历程和方法论.坦白说,刚开始接触STM32时,我也是一脸懵逼.机械专业毕业的我转行做嵌入式,第一份工作被调剂到电子部门,实 ...

  7. Web前端入门第 42 问:聊聊 CSS 元素上下左右(水平+垂直)同时居中有几种方法

    影响元素位置的 CSS 属性基本介绍完毕(参考前几篇文章),现思考一个最常见的需求: 一个子元素,要摆放在盒子的正中央,使用 CSS 布局手段,究竟有多少种实现方式? 上下左右(水平方向.垂直方向)要 ...

  8. python-docx styles(样式)的用法

    doc=Document()#创建一个空白文档 p=doc.add_paragraph()#给文档增加一个段落 p.paragraph_format.space_before=Pt(0)#设置段落 段 ...

  9. 代码随想录第十三天 | Leecode 144. 二叉树的前序遍历、 94. 二叉树的中序遍历、 145. 二叉树的后序遍历

    Leecode 144. 二叉树的前序遍历 题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/ 题目描述 给你二叉树的根 ...

  10. 【BUG】Python3|安装python3-pip依赖缺失,might want to run ‘apt --fix-broken install‘ to correct these. unment

    今天装python,版本装错了. 然后删又删不掉,装pip又装不上,报错是这样的: 想装的时候: 7f2a0f717aa3:~/$ sudo apt-get install python3-pip p ...