1.elasticsearch文档存储(保存|修改|删除)

【README】

0.本文部分内容(数据)总结自 es 开发文档, Document APIs | Elasticsearch Guide [7.2] | Elastic ;

1.本文的es版本是7.2.1;

2.elasticsearch 是一个数据存储,检索和分析引擎;本文介绍的是 es数据存储开发方式;

  • es是以文档为单位存储数据的,数据被序列化为json文档进行存储;

3.文档存储包括文档保存,修改,删除;(文档查询的开发方式比较复杂,单独新开一篇阐述)

  • 保存文档:使用 put 或 post请求;
  • 修改文档:使用put和post请求;
    1. put请求更新文档是全量替换;
    2. post请求路径不带 _update 更新文档是 全量替换
    3. post请求路径带 _update 更新文档是 部分更新;且 带了 _update 时,会比较新老数据是否相同,若相同则不执行更新,返回noop;
  • 删除文档:用delete请求(包括删除文档,删除索引);

【1】保存文档

保存文档可以用put请求或post请求;

  • Put 与 post请求保存文档的区别:put必须带文档id,post可以带 或者不带id;

【1.1】put请求保存文档

1) 在customer索引下的 external类型下保存2号文档,文档id设置为2

Put localhost:9200/customer/external/2{"name":"zhangsan2"
}{"_index": "customer","_type": "external","_id": "2","_version": 1,"result": "created", // 这里表示创建"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 2,"_primary_term": 1
} 

2)再执行一次,result就是更新 updated 的了;

{"_index": "customer","_type": "external","_id": "2","_version": 2,"result": "updated", // 第2次执行就是更新 "_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 3,"_primary_term": 1
}

【1.2】post请求保存文档

1) 在customer索引下的 external类型下保存文档(不带文档id);

Post localhost:9200/customer/external {"name":"zhangsan_post_1"
}{"_index": "customer","_type": "external","_id": "Qb1Gq4MBJc7j47GNcnTa", // 自动生成id,请求路径不需要设置id "_version": 1,"result": "created",  // 新增数据"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 4,"_primary_term": 1
}

【Post请求小结】

  • 不带id就是永远新增,带了id的规则是无则新增,有则更新

2)post请求保存文档,带文档id

Post  localhost:9200/customer/external/Qr1Jq4MBJc7j47GNp3RF 
{"name":"zhangsan_post_3"
}{"_index": "customer","_type": "external","_id": "Qr1Jq4MBJc7j47GNp3RF","_version": 5,  // 版本号递增 "result": "updated",  // 更新 "_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 9,"_primary_term": 1
}

【2】es文档简单查询

为了方便验证es文档保存,修改,删除的效果,本文介绍了一个简单查询。

【2.1】get请求带文档id查询文档

Get localhost:9200/customer/external/1
{}{"_index": "customer", // 在哪个索引 "_type": "external", // 在哪个类型 "_id": "1",  // 记录id "_version": 2,  // 表明数据被更新过,因为新建数据的版本号是1 "_seq_no": 1,  // 并发控制字段,每次更新就会+1;用来做乐观锁;"_primary_term": 1,  // 同上,主分片重新分配,如重启,就会变化 "found": true,  // "_source": {  // 真正的内容 "name": "zhangsan"}
}

【2.2】seq_no 和 primary_term 做并发控制(乐观锁)

步骤1)查询id等于1的文档

{"_index": "customer","_type": "external","_id": "1","_version": 4,"_seq_no": 11,"_primary_term": 1,"found": true,"_source": {"name": "zhangsan2_update_seq_11"}
}

步骤2)把 seq_no 和 primary_term 作为更新条件

客户端1:(修改成功

Post localhost:9200/customer/external/1?if_seq_no=11&if_primary_term=1
{"name":"zhangsan_post_update_c1"
}{"_index": "customer","_type": "external","_id": "1","_version": 5,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 12,"_primary_term": 1
}

客户端2(修改失败),因为 seq_no 因客户端1修改文档的事件而递增了,即不等于11

Post  localhost:9200/customer/external/1?if_seq_no=11&if_primary_term=1 
{"name":"zhangsan_post_update_c2"
}{"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[1]: version conflict, required seqNo [11], primary term [1]. current document has seqNo [12] and primary term [1]","index_uuid": "IIq46lyCQMisw9_iPDheiw","shard": "0","index": "customer"}],......},"status": 409
}

【3】修改文档

1)post 或 put请求都可以修改文档;

  • post请求修改文档又分为 请求路径带 _update 和 不带_update;(post不带_update更新文档是全量替换,带_update 是部分更新)
  • put请求修改文档 时的请求路径不能带 _update ;(put更新文档是全量替换)

【3.1】post请求路径带_update更新文档

1)更新文档id为1的文档

Post localhost:9200/customer/external/1/_update
{"doc":{ // 注意 post请求路径带update的更新的请求体不同"name":"post_update_202210061135"}
}{"_index": "customer","_type": "external","_id": "1","_version": 6,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 13,"_primary_term": 1
}

2)再发送一次相同请求,且报文体也相同,则得到 noop ;

Post localhost:9200/customer/external/1/_update
{"doc":{"name":"post_update_202210061135"}
}{"_index": "customer","_type": "external","_id": "1","_version": 6,"result": "noop", // 没有做任何操作 "_shards": {"total": 0,"successful": 0,"failed": 0}
}

【3.2】post请求路径不带_update更新文档

1)更新id等于1的文档

Post localhost:9200/customer/external/1
{"name":"zhangsan_post_update_noupdate"
}{"_index": "customer","_type": "external","_id": "1","_version": 7,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 14,"_primary_term": 1
}

2)再发一次相同请求,相同报文体,如下:

{"_index": "customer","_type": "external","_id": "1","_version": 8,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 15,"_primary_term": 1
}

【小结】

  • Post请求路径带update,会检查新老数据是否相同,若相同,则无需更新;即version, seq_no 都不会增加;
  • Post请求路径不带update,则不会检查新老数据是否相同,无论是否相同,都会更新;即 version 和 seq_no 都会增加;

【3.3】put请求路径带_update更新文档(API不存在

put请求更新文档时,其请求路径不能带 _update ;

【3.4】put请求路径不带_update更新文档 (全量替换)

0)初始数据:id为2的文档;

post localhost:9200/customer/external/2
{}
{"_index": "customer","_type": "external","_id": "2","_version": 6,"_seq_no": 8,"_primary_term": 2,"found": true,"_source": {"name": "post_zhangsan_02","addr": "post_addr_02"}
}

1)更新id为2的文档

Put localhost:9200/customer/external/2
{"doc":{"name":"put_update_202210071519"        }
}
// 更新后的结果 
{"_index": "customer","_type": "external","_id": "2","_version": 7,"_seq_no": 9,"_primary_term": 2,"found": true,"_source": {"doc": {"name": "put_update_202210071519"}}
}

【小结】

  • put请求路径不带_update可以更新成功; 不会检查新老数据是否相同,都会更新
  • put请求更新文档是全量覆盖(虽然put请求仅更新了name字段,但结果是addr字段被删除了);

【3.5】post请求为索引新增字段

1)为id为1的文档新增 addr 字段;

Post localhost:9200/customer/external/1 
{"doc":{"name":"post_noupdate_202210061151", "addr":"成都高新区01_post_新增属性"}
}{"_index": "customer","_type": "external","_id": "1","_version": 11,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 18,"_primary_term": 1
}

【3.6】put请求为索引新增字段

1)为id为1的文档新增 addr 字段;

Put localhost:9200/customer/external/1  
{"doc":{"name":"post_noupdate_202210061154", "addr":"成都高新区02_put_新增属性"}
}{"_index": "customer","_type": "external","_id": "1","_version": 12,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 19,"_primary_term": 1
}

【3.7】post请求更新文档时带_update与不带_update的区别

1)post请求路径带_update,仅部分更新(我想大部分场景应该选择带 _update)

  • 如文档有字段1,字段2;
  • 通过post带update的更新,可以仅更新字段1 或 字段2; 

2)post请求路径不带update,是全量覆盖

  • 如文档有字段1,字段2;
  • 通过post不带update的更新,是全量覆盖;

3)例子(post请求带与不带_update 更新文档的区别):

3.0)初始数据

get localhost:9200/customer/external/2 
{}
{"_index": "customer","_type": "external","_id": "2","_version": 6,"_seq_no": 24,"_primary_term": 1,"found": true,"_source": {"name": "zhangsan2_insert","addr": "post_带update_成都04"}
}

3.1)Post请求路径带update的部分更新

Post localhost:9200/customer/external/2/_update 
{"doc":{"addr":"post_带update_成都05"}
}// 更新后的结果(部分更新): 
{"_index": "customer","_type": "external","_id": "2","_version": 7,"_seq_no": 25,"_primary_term": 1,"found": true,"_source": {"name": "zhangsan2_insert","addr": "post_带update_成都05"}
}

3.2)post请求路径不带_update 的全量替换

Post localhost:9200/customer/external/2
{    "addr":"post_不带update_成都06"    
}// 更新后的结果(全量替换):
{"_index": "customer","_type": "external","_id": "2","_version": 8,"_seq_no": 26,"_primary_term": 1,"found": true,"_source": {"addr": "post_不带update_成都06" // (显然,这里是全量替换)}
}

【4】删除数据(删除文档和索引)

【4.1】删除文档

1)删除文档id为2的文档

Delete localhost:9200/customer/external/2{"_index": "customer","_type": "external","_id": "2","_version": 9,"result": "deleted", // 删除成功 "_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 27,"_primary_term": 1
}

2)删除完成后,再次查询id为2的文档,如下:

Get localhost:9200/customer/external/2 
{}{"_index": "customer","_type": "external","_id": "2","found": false  // 显然没有找到 
}

【4.2】删除索引

注意: es中没有提供删除类型的api  ;

1)删除customer索引;

Delete localhost:9200/customer{"acknowledged": true
}

2)删除索引文档后,,再次查询(报索引不存在);

Get localhost:9200/customer/external/2
{}
{"error": {"root_cause": [{"type": "index_not_found_exception","reason": "no such index [customer]","resource.type": "index_expression","resource.id": "customer","index_uuid": "_na_","index": "customer"}],...... },"status": 404
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

db9针232接口波特率标准_理解串口通信以及232,485,422常见问题

下面先讲一讲串口通信的一些基本概念,术语。如果对串口通信比较熟悉的,就当复习复习,如果哪里讲错或不到位,也可以及时指出,当作一块交流交流。这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲。因…

理解 .NET Platform Standard

.NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md .NET Platform Standard 是什么?直译过来就是 .NET 平台规范或标准,它的目的就是使 .NET 各个平台之间更加统一…

Oracle入门(十四.18)之使用动态SQL

一、SQL的执行流程数据库中的所有SQL语句都经历了不同的阶段: •解析:预执行“这可能吗?”检查包括语法,对象存在,权限等 •绑定:获取语句中引用的任何变量的实际值 •执行:语句被执行。•提取&…

天平游码读数例题_初二上册物理实验——托盘天平使用的注意事项

今天给大家讲讲托盘天平的使用和注意事项。(1)首先,我们回忆一下什么是托盘天平如下图托盘天平由底座、横梁、分度盘、托盘、平衡螺母、标尺、游码、托盘等组成,当然还有砝码。托盘天平是称量物体的质量的工具(质量符号m,单位:国际…

3.elasticsearch文档查询dsl

【README】 1.本文elasticsearch版本是 7.2.1; 2.文档查询语句叫做 DSL, domain structure language, 领域特定语言;dsl,参见 Query DSL | Elasticsearch Guide [7.2] | Elastic 3.elasticsearch 基于json 提供了完…

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作:UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

Oracle入门(十四.20)之创建DML触发器:第一部分

一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFORE,AFTE…

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…

Oracle入门(十四.23)之管理触发器

一、触发器需要特权要在模式中创建触发器,需要: •CREATE TRIGGER系统特权 •触发器主体中引用的其他架构中的对象的普通对象特权(SELECT,UPDATE,EXECUTE等) •与触发器关联的表或视图上的ALTER特权。触发器…