ES 16 - 对Elasticsearch中的索引数据进行增删改查 (CRUD)

时间:2022-12-17 23:37:18

说在前面: 本文的所有演示, 都是基于Elasticsearch 6.6.0进行的, 不同的版本可能存在API发生修改、不支持的情况, 还请注意.

1 创建document

1.1 创建时手动指定id

(1) 适用情景:

从其他系统中导入数据到ES时, 会采取这种方式: 使用原有系统中数据已有的唯一标识, 作为ES中document的id.

而如果数据一生产出来就存储到了ES中, 一般是不适合手动指定id的.

(2) 使用语法:

put index/type/id

(3) 使用示例:

PUT employee/developer/1
{
"name": "shoufeng",
"e_id": 5220
}

(4) 添加成功后的响应信息:

{
"_index" : "employee",
"_type" : "developer",
"_id" : "1", // 指定了id, 控制底层的_id元字段
"_version" : 1, // 当前版本号, 基于此字段进行并发控制
"result" : "created",
"_shards" : {
"total" : 2, // 参与创建的分片数, 包括Primary和Replica
"successful" : 1, // 成功创建索引的分片数量
"failed" : 0 // 创建索引失败的分片数量
},
"_seq_no" : 0,
"_primary_term" : 1
}

1.2 创建时自动生成id

(1) 使用情景:

ES作为数据存储服务器, 应用程序中的数据直接对接到ES中, 这种场景适合自动生成id.

在多节点并发生成大量数据的场景下, 自动生成id更具安全性.

(2) 使用语法:

POST index/type

(3) 使用示例:

POST employee/developer
{
"name": "shoufeng",
"sex": "male",
"age": 20
}

(4) 添加成功后的响应结果:

{
"_index" : "employee",
"_type" : "developer",
"_id" : "vMxcFWoBfKUnm9s_Uxen", // 没有指定id, 就会自动生成id, 长度为20个字符
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}

官方文档中指出:

Elasticsearch自动生成的id, 长度为20个字符, 是URL安全的, 它是Base64编码的GUID字符串, 多节点(分布式系统)并行生成id时不会发生冲突.

2 查看document

2.1 根据id查询文档

查询时可以不指定type, 即下述的developer, 而用_all代替.

// 查询语法:
GET employee/developer/1 // 结果如下:
{
"_index" : "employee",
"_type" : "developer",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : { // 文档的元数据
"name" : "shoufeng",
"e_id" : 5220
}
}

2.2 通过_source字段控制查询结果

(1) 只获取指定id的文档的_source内容:

GET employee/developer/1/_source
// 结果是:
{
"name" : "shoufeng",
"e_id" : 5220
}

(2) 禁用指定id的文档的_source字段:

GET employee/developer/1?_source=false
// 结果是:
{
"_index" : "employee",
"_type" : "developer",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true
}

(3) 过滤_source中的某些field:

// _source_includes和_source_excludes可以匹配通配符*
GET employee/developer/1?_source_includes=name,age&_source_excludes=sex
GET employee/developer/_search?_source_includes=name,age&_source_excludes=sex

(4) 通过stored_fields API过滤文档中已存储的字段:

在Elasticsearch 6.0之后, 不再支持fields, 需要使用stored_fieldsAPI替换.

GET employee/developer/1?stored_fields=name,age        // 指定id
GET employee/developer/_search?stored_fields=name,age // 不指定id, 将查询所有文档

其他查询操作, 将在后续的文章中详细演示.

3 修改document

3.1 全量替换document

全量替换是基于指定文档id的修改:

// 语法与创建语法相同:
PUT employee/developer/1
{
"name": "shoufeng001", // 修改姓名
"age": 20, // 添加年龄
"sex": "male", // 添加性别
"e_id": 5220
}

操作过程说明:

① 如果指定的document id不存在, 就是创建操作;

② 如果指定的document id已经存在, 就是全量替换操作 —— 替换旧文档的JSON串内容;

Lucene中倒排索引一旦被创建就是不可变的, 要修改文档内容, 可以采取全量替换的方式 —— 对文档重新建立索引, 替换旧文档的所有内容;

④ ES会将旧文档标记为deleted, 然后根据我们提交的请求创建一个新文档, 当标记为deleted的文档数达到一定量时, ES会在自动删除这些旧文档.

3.2 强制创建document

(1) 存在这样的场景:

我们不知道索引中是否已经存在某个文档 —— 可能有其他用户在并发添加文档;

为了防止创建操作被执行为全量替换操作, 从而导致数据的丢失, 我们可以使用强制创建的方式, 来避免这种失误.

(2) 强制创建示例:

PUT employee/developer/1?op_type=create
{
"name": "shoufeng",
"age": 20
}
// 或者使用:
PUT employee/developer/1/_create
{
"name": "shoufeng",
"age": 20
} // 响应结果中出现冲突:
{
"error": {
"root_cause": [
{ // 由于文档已经存在, 发生版本冲突, 导致创建失败
"type": "version_conflict_engine_exception",
"reason": "[developer][1]: version conflict, document already exists (current version [2])",
"index_uuid": "OYu6J2x_S2S5v-R74aq6NQ",
"shard": "3",
"index": "employee"
}
],
"type": "version_conflict_engine_exception",
"reason": "[developer][1]: version conflict, document already exists (current version [2])",
"index_uuid": "OYu6J2x_S2S5v-R74aq6NQ",
"shard": "3",
"index": "employee"
},
"status": 409
}

出现冲突的原因:

Elasticsearch通过乐观锁控制每个文档的_version信息, 强制创建语法会对当前操作的文档的_version信息进行初始化;

② 添加索引时, 发现已经存在对应id的文档, 而且其版本号与正在强制创建的文档的版本信息不匹配, 所以报错.

出现冲突后, 我们就能知道索引中已存在该文档了, 就可以根据自己的应用需求, 采取更改id后重新添加, 或者更改已有的文档等操作.

4 删除document

(1) 删除语法:

DELETE index/type/id

(2) 删除示例:

DELETE employee/developer/1
// 再次查看id为1的文档, 发现"found": false

(3) Elasticsearch删除文档采取的是懒删除机制:

不会立即物理删除, 而是将其标记为deleted, 当被删除的文档数量达到一定级别后, ES会在后台自动删除这些文档.

版权声明

作者: 马瘦风(https://healchow.com)

出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶

ES 16 - 对Elasticsearch中的索引数据进行增删改查 (CRUD)的更多相关文章

  1. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  2. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  3. mysql学习笔记一 —— 数据的增删改查

    1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...

  4. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  5. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  6. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  7. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  8. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  9. Elasticsearch 单模式下API的增删改查操作

    <pre name="code" class="html">Elasticsearch 单模式下API的增删改查操作 http://192.168. ...

随机推荐

  1. paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning

    来源:http://blog.csdn.net/abcjennifer/article/details/7804962 无监督学习近年来很热,先后应用于computer vision, audio c ...

  2. 洗衣店专用手持智能POS PDA手持设备 上门收衣 现场刷卡 打印票据 开单系统

    手持上门收衣设备通过wifi或者3G手机卡等进行联网,功能便捷强大,多功能一体同步使用,通过手持机上门收.取衣物,快速开单收衣消费.取货.新建会员.现场办理会员发卡.手持机读发会员卡和会员用卡消费等. ...

  3. linux下avr单片机开发:中断服务程序

    不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-av ...

  4. 视差滚动特效图片滑块-Sequence&period;js

    效果演示     插件下载

  5. 【笔记】移动端H5数字键盘input type&equals;number的处理(IOS和Android)

    在Vue中的项目,基于VUX-UI开发,一个常见的需求: 1.金额输入框 2.弹出数字键盘 3.仅支持输入两位小数,限制最大11位数,不允许0开头 后续:与UI沟通后, 思路调整为限制输入,并减少正则 ...

  6. asp&period;net core系列 25 EF模型配置&lpar;隐藏属性&rpar;

    一. 隐藏属性概述 隐藏属性也叫影子属性,该属性不是在.net实体类中定义的属性,而是在EFCore模型中为该实体类型定义的属性.这些属性的值和状态完全在变更跟踪器中维护.它有二个功能:(1)当数据库 ...

  7. C语言冒泡&lpar;起泡&rpar;排序与选择排序的循环条件区别

    冒泡排序(写法1): i = 0; i < n-1; ++i{ flag = true; j = 0; j < n-1-i; ++j{//从前面开始冒泡 if( arr[j] < a ...

  8. ActiveMQ 处理不同类型的消息

    ActiveMQ 中的消息都继承自 org.apache.activemq.command.BaseCommand 类. broker 处理消息的调用栈如下: TransportConnection ...

  9. 51nod 1673 树有几多愁——虚树&plus;状压DP

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...

  10. 洛谷P3605 &lbrack;USACO17JAN&rsqb; Promotion Counting 晋升者计数 &lbrack;线段树合并&rsqb;

    题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...