一 更新整个文档

更新整个文档的方法和存放数据的方式是相同的,通过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) 数据操作-更新的更多相关文章

  1. Elasticsearch删除数据操作,你必须知道的一些坑

    前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...

  2. elasticsearch(2) 数据操作——查询

    一 文档 ES面向文档,并且使用JSON作为文档序列化格式,对于ES来说,文档特指根对象序列化成的JSON数据,以唯一ID标识并存储于ES中. 文档元数据 三个必须的元数据节点 1._index   ...

  3. 使用Python对ElasticSearch获取数据及操作

    #!/usr/bin/env python# -*- coding: utf-8 -*-""" @Time : 2018/7/4 @Author : LiuXueWen ...

  4. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  5. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  6. DML数据操作语言之增加,删除,更新

    1.数据的增加 数据的增加要用到insert语句  ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...

  7. Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)

    Elasticseach目前作为查询搜索平台,的确非常实用方便.我们今天在这里要讨论的是如何做数据备份和type删除.我的ES的版本是2.4.1. ES的备份,可不像MySQL的mysqldump这么 ...

  8. python对MySQL进行数据的插入、更新和删除之后需要commit,数据库才会真的有数据操作。(待日后更新)

    今天在尝试用下面的python代码对MySQL进行数据的插入.更新和删除时, 突然发现代码执行成功, 通过代码查询也显示数据已经插入或更新, 但是当我在MySQL客户端通过SQL语句查询时, 数据库中 ...

  9. SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比

    引文 本文主要介绍如何使用mybatis插件实现拦截数据库操作并根据不同需求进行数据对比分析,主要适用于系统中需要对数据操作进行记录.在更新数据时准确记录更新字段 核心:mybatis插件(拦截器). ...

随机推荐

  1. Qt551.窗口滚动条

    1.代码的方式来创建 ScrollArea,然后使用 倒是 正常(有滚动条显示),但是此方式太麻烦 不如直接拖控件来的方便直观快捷. 但是,直接拖控件的方式 ScrollArea中无法显示出 滚动条, ...

  2. git pull和本地文件冲突

    在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息: error: Your local changes to 'c/environ.c' would be overwritten b ...

  3. GlusterFS分布式文件系统的使用

    glusterfs是一款开源的分布式文件系统. 它具备高扩展.高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可轻松达到PB级别,支持数千客户端并发访问. ...

  4. SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]

    SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...

  5. Django框架简介-模型系统

    2.5 模型 2.5.1 ORM介绍 2.5.1.1 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现 ...

  6. ubuntu 安装nginx, 出现 Unable to locate package

    今天在初始化一台新的ubuntu 服务器时,敲上了 sudo apt-get install nginx 来安装nginx, 却发现提示:  Reading package lists... Done ...

  7. win7安装loadrunner 安装相关问题解决方案

    安装loadrunner缺少2.8 sp1组件解决方案 这是因为注册表缺少FullInstallVer和Version,归根到底是madc安装的的问题 以下是解决方法: 1.运行regedit,打开注 ...

  8. 简单的压力测试工具 siege

    $ siege -c 1000 -r 100 -b http://127.0.0.1:13579/3344 HTTP/1.0 200 0.02 secs: 49 bytes ==> GET /3 ...

  9. 浏览器与WEB服务器交互

    问题:打开浏览器,在地址栏输入url到页面展现,整个过程发生了什么? 图示: 步骤: 1 用户输入网址,包括协议和域名. 2 浏览器先查找自身缓存有没有记录,没有的话再找操作系统缓存. 3 当浏览器在 ...

  10. Spring Boot 小技巧

    初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC .两种方式各有区别下面来详细介绍. 使用 Jpa 在使用s ...