elasticsearch(3) 数据操作-更新
一 更新整个文档
更新整个文档的方法和存放数据的方式是相同的,通过PUT 127.0.0.1/test/test/1 我们可以把test/test/1下的文档更新为新的文档
例:
PUT 127.0.0.1:9200/test/test/1
参数
- {
- "newdata":"yes"
- }
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "",
- "_version": ,
- "result": "updated",
- "_shards": {
- "total": ,
- "successful": ,
- "failed":
- },
- "_seq_no": ,
- "_primary_term":
- }
可以看到响应的参数里_version已经变为了2,并且result为updated 说明此操作为更新操作
二 文档局部更新
如果不想讲原有文档完全更新,只想更新部分文档,可以使用ES的_update api 参数是一个局部文档参数doc,它会合并到现有文档中,存在的字段被覆盖,有点类似map的putAll操作
示例
POST 127.0.0.1;9200/test/test/1/_update
参数
- {
- "doc":{
- "newdata":"no",
- "author":"wuzhe"
- }
- }
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "",
- "_version": ,
- "result": "updated",
- "_shards": {
- "total": ,
- "successful": ,
- "failed":
- },
- "_seq_no": ,
- "_primary_term":
- }
三 删除文档
想要删除文档,可以使用DELETE 请求方式
示例:
DELETE 127.0.0.1:9200/test/test/1
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "",
- "_version": ,
- "result": "deleted",
- "_shards": {
- "total": ,
- "successful": ,
- "failed":
- },
- "_seq_no": ,
- "_primary_term":
- }
如果删除成功,那么状态码为200 ,且result 为deleted, 我们可以看到响应中的_version由3变为了4,也就是版本号发生了变化,这是因为对于ES来说,删除文档并不是把它从硬盘中物理删除,而是将其标记为已删除,实现逻辑上的删除
那如果没有删除成功,响应会是什么样的呢?
我们尝试删除一个不存在的文档
DELETE 1270.0.01:9200/test/test/100
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "",
- "_version": ,
- "result": "not_found",
- "_shards": {
- "total": ,
- "successful": ,
- "failed":
- },
- "_seq_no": ,
- "_primary_term":
- }
这时候 响应状态码变为了404,并且result变为了not_found
四 创建文档
之前说到的完整文档更新和新建文档的操作是完全一样的,那我如何确定这次操作一定是创建操作呢,毕竟绝大多数情况,我们并不想一不小心覆盖了已有文档的数据
一种方案是,采用ES自动生成的ID,这样可以保证每次插入操作都是创建操作
那如果我一定要使用自定义的ID呢?
可以通过使用op_type这个参数
示例
PUT 127.0.0.1:9200/test/test/6?op_type=create
请求参数为文档内容
- {
- "test":"test",
- "author":"wuzhe"
- }
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "",
- "_version": ,
- "result": "created",
- "_shards": {
- "total": ,
- "successful": ,
- "failed":
- },
- "_seq_no": ,
- "_primary_term":
- }
可以看到这里文档新建成功了,result为created并且version为1
如果我们再次执行相同的操作,即对已有数据进行创建
响应
- {
- "error": {
- "root_cause": [
- {
- "type": "version_conflict_engine_exception",
- "reason": "[test][6]: version conflict, document already exists (current version [1])",
- "index_uuid": "7i4nU37hQJWCRUm1Hop0Gw",
- "shard": "",
- "index": "test"
- }
- ],
- "type": "version_conflict_engine_exception",
- "reason": "[test][6]: version conflict, document already exists (current version [1])",
- "index_uuid": "7i4nU37hQJWCRUm1Hop0Gw",
- "shard": "",
- "index": "test"
- },
- "status":
- }
可以看到这时候的响应码为409,说明版本号冲突了,无法创建成功。
五 版本控制
在并发场景下,ES使用乐观并发控制的方式,ES保证所有的文档的_version都能被正常排序,当一个旧版本的文档出现在新版本之后,那么它会被ES简单的忽略
1、使用指定版本号修改文档
在修改文档的时候使用version参数
示例:
PUT 127.0.0.1:9200/test/test/6?version=1 (只有在文档版本为1的情况下更新成功)
参数:
- {
- "test":"test1",
- "author":"wuzhe"
- }
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "6",
- "_version": 2,
- "result": "updated",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- },
- "_seq_no": 3,
- "_primary_term": 1
- }
可以看到这时候更新成功了,因为/test/test/6 的版本之前为1,现在更新为了2,。
我们再尝试一次请求,这时候的响应变成了
- {
- "error": {
- "root_cause": [
- {
- "type": "version_conflict_engine_exception",
- "reason": "[test][6]: version conflict, current version [2] is different than the one provided [1]",
- "index_uuid": "7i4nU37hQJWCRUm1Hop0Gw",
- "shard": "2",
- "index": "test"
- }
- ],
- "type": "version_conflict_engine_exception",
- "reason": "[test][6]: version conflict, current version [2] is different than the one provided [1]",
- "index_uuid": "7i4nU37hQJWCRUm1Hop0Gw",
- "shard": "2",
- "index": "test"
- },
- "status": 409
- }
说明更新时遇到了版本号冲突,这时候响应状态码为409
2、使用外部版本控制系统
一种常见的结构是使用一些其他的数据库做为主数据库,然后使用Elasticsearch搜索数据,这意味着所有主数据库发生变化,就要将其拷贝到Elasticsearch中。如果有多个进程负责这些数据的同步,就会遇到上面提到的并发问题。
如果主数据库有版本字段,或一些类似于timestamp
等可以用于版本控制的字段 你就可以在Elasticsearch的查询字符串后面添加version_type=external
来使用这些版本号。版本号必须是整数,且值大于零小于java正的Long型最大值
外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查_version
是否与请求中指定的一致,而是检查是否小于指定的版本。如果请求成功,外部版本号就会被存储到_version
中。
示例:
PUT 127.0.0.1:9200/test/test/6?version=10&version_type=external
请求
- {
- "test":"test10",
- "author":"wuzhe"
- }
响应
- {
- "_index": "test",
- "_type": "test",
- "_id": "6",
- "_version": 10,
- "result": "updated",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- },
- "_seq_no": 4,
- "_primary_term": 1
- }
可以看到之前test/test/6的版本号为2, 现在已经被更新为了10
elasticsearch(3) 数据操作-更新的更多相关文章
- Elasticsearch删除数据操作,你必须知道的一些坑
前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...
- elasticsearch(2) 数据操作——查询
一 文档 ES面向文档,并且使用JSON作为文档序列化格式,对于ES来说,文档特指根对象序列化成的JSON数据,以唯一ID标识并存储于ES中. 文档元数据 三个必须的元数据节点 1._index ...
- 使用Python对ElasticSearch获取数据及操作
#!/usr/bin/env python# -*- coding: utf-8 -*-""" @Time : 2018/7/4 @Author : LiuXueWen ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
- DML数据操作语言之增加,删除,更新
1.数据的增加 数据的增加要用到insert语句 ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...
- Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)
Elasticseach目前作为查询搜索平台,的确非常实用方便.我们今天在这里要讨论的是如何做数据备份和type删除.我的ES的版本是2.4.1. ES的备份,可不像MySQL的mysqldump这么 ...
- python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)
今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...
- SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比
引文 本文主要介绍如何使用mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:mybatis插件(拦截器). ...
随机推荐
- js查找、自组织数据
function search(arr, data) { ; i < arr.length; ++i) { if (arr[i] == data) { return true; } } retu ...
- UML与软件建模:第一次作业(用例图绘制)
一.小结 用例图是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和结束. 用例图的要素: (1)参与者,即与用例存在交互关系的系统外部实体; (2)用例,用来描述个 ...
- 自动生成CHANGELOG.md
$ npm install -g conventional-changelog-cli $ cd my-project $ conventional-changelog -p angular -i C ...
- mtcnn
1.widerface样本标签处理 图片名 x1 y1 x2 y2 x11 y11 x22 y22 多人脸框 # -*- coding: utf- -*- ""&qu ...
- jquery表单提交获取数据(带toast dialog)
最近写了一个召集令,传统表单提交注册.写写遇到的费时间的点与解决办法 git项目地址:form-demo(针对于手机版,懒人可以直接使用,有排版和样式) demo使用Jquery,toast使用jqu ...
- SWUST OJ(1028)
特定字符序列的判断 #include <iostream> #include <cstdlib> #include <stack> #include <str ...
- Cmake时 如何在windows命令行 选择vs版本
本人电脑装了VS2017 和 VS2013版本.可能时VS2017安装的时间早,每次cmake文件时优先选择编译成VS2017的文件 可通过查看VS2013的版本,使用 cmake ../pcl-su ...
- git相关操作记录
拉取远端并强制覆盖本地文件 有时候会出现想放弃本地修改的情况,那么只需要下面几行命令 git fetch --all git reset --hard origin/master git pull / ...
- Anaconda与Spyder升级命令
step1:首先以管理员的身份启动cmd.exe: step2:升级conda(升级Anaconda前需要先升级conda)命令为:conda update conda step3:升级anacond ...
- web前端超出两行用省略号表示
HTML <span class="GW_bod0112211"> 吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑加仑葡萄干500g包邮无籽吐鲁番特级无炳黑 ...