Elasticsearch的Update更新

更新

Update更新操作允许ES获得某个指定的文档,可以通过脚本等操作对该文档进行更新。可以把它看成是先删除再索引的原子操作,只是省略了返回的过程,这样即节省了来回传输的网络流量,也避免了中间时间造成的文档修改冲突。

下面就是更新的例子:

curl -XPUT localhost:9200/test/type1/1 -d ‘{
    "counter" : 1,
    "tags" : ["red"]
}‘

脚本更新

Es支持通过脚本更改文档的信息:

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : {
        "inline": "ctx._source.counter += count",
        "params" : {
            "count" : 4
        }
    }
}‘

上面就是通过参数来为每个counter加4.

也可以添加某个标记:

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : {
        "inline": "ctx._source.tags += tag",
        "params" : {
            "tag" : "blue"
        }
    }
}‘

除了_source字段,可以通过ctx来获得_index_type_id_version_parent_timestamp_ttl等字段信息。

也可以添加某个字段:

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : "ctx._source.name_of_new_field = \"value_of_new_field\""
}‘

移除字段:

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : "ctx._source.remove(\"name_of_field\")"
}‘

也支持稍微复杂点的逻辑,比如根据某个标记执行不同的操作。比如如果有blue这个标记,则删除该文档;否则什么也不做:

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : {
        "inline": "ctx._source.tags.contains(tag) ? ctx.op = \"delete\" : ctx.op = \"none\"",
        "params" : {
            "tag" : "blue"
        }
    }
}‘

只更新部分文档

上面的脚本是对所有的文档都起作用,这里讲解下如何只对部分文档进行修改。使用doc可以实现简单的递归合并、内部合并、替换KV以及数组。

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "doc" : {
        "name" : "new_name"
    }
}‘

如果同时使用了doc和script,那么doc的操作会自动忽略。因此最好是把特殊的操作也放在脚本中。

更新检测

如果使用doc,那么会自动合并到现有的文档中。如果doc中定义的部分与现在的文档相同,则默认不会执行任何动作。设置detect_noop=false,就会无视是否修改,强制合并到现有的文档。

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "doc" : {
        "name" : "new_name"
    },
    "detect_noop": false
}‘

上面的例子中,如果name字段为new_name,无论当前的文档是否与doc中定义的相同,都会把doc合并到文档中。

upsert插入

这个参数主要用于当文档不存在时,ES的操作。

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "script" : {
        "inline": "ctx._source.counter += count",
        "params" : {
            "count" : 4
        }
    },
    "upsert" : {
        "counter" : 1
    }
}‘

在上面的例子中,当文档存在时,执行脚本;当文档不存在时,upsert中的内容就会插入到对应的文档中。

如果你想无论文档是否存在都执行脚本操作,那么可以使用参数scripted_upsert为true。

curl -XPOST ‘localhost:9200/sessions/session/dh3sgudg8gsrgl/_update‘ -d ‘{
    "scripted_upsert":true,
    "script" : {
        "id": "my_web_session_summariser",
        "params" : {
            "pageViewEvent" : {
                "url":"foo.com/bar",
                "response":404,
                "time":"2014-01-01 12:32"
            }
        }
    },
    "upsert" : {}
}‘

相对于之前的使用Upsert中的内容添加到不存在的文档,使用doc_as_upsert可以在文档不存在的时候,把doc中的内容插入到文档中。

curl -XPOST ‘localhost:9200/test/type1/1/_update‘ -d ‘{
    "doc" : {
        "name" : "new_name"
    },
    "doc_as_upsert" : true
}‘

参数

retry_on_conflict

当执行索引和更新的时候,有可能另一个进程正在执行更新。这个时候就会造成冲突,这个参数就是用于定义当遇到冲突时,再过多长时间执行操作。

routing

Routing is used to route the update request to the right shard and sets the routing for the upsert request if the document being updated doesn’t exist. Can’t be used to update the routing of an existing document.

parent

Parent is used to route the update request to the right shard and sets the parent for the upsert request if the document being updated doesn’t exist. Can’t be used to update the parent of an existing document.

timeout

当分片不可用的时候,等待多长时间

consistency

The write consistency of the index/delete operation.

索引/删除操作的写一致性!不知道怎么用

refresh

当执行操作的时候,会自动刷新索引。

fields

执行完更新后,返回的字段

version & version_type

更新操作会使用版本号来确定 拿到文档到执行更新期间,文档是否被修改过。也可以通过特定的版本号,更新文档。如果使用force作为版本号,那么更新操作将不会再改变版本号。注意,这样就无法保证文档是否被修改了。

外部版本号

更新操作是不支持外部版本号的,因为本来外部版本号就脱离系统的版本控制,如果再执行更新操作,那就彻底乱了。如果使用了外部版本号,可以使用Index代替更新操作,重新索引文档。

时间: 2024-10-14 11:17:03

Elasticsearch的Update更新的相关文章

apt-get update 更新 ubuntu时出现Hash sum mismatch的原因及解决方法

$ sudo apt-get update ...... Hit http://mirrors.163.com trusty/main Sources                                 Hit http://mirrors.163.com trusty/restricted Sources                           Get:17 http://mirrors.163.com trusty/universe Sources [6,399 kB

Cocoapods pod update更新第三方库后出现 file not found 问题解决方法!

Cocoapods,pod update更新第三方库后第三方库已经下载到项目中,但在引用头文件时出现 file not found  问题 ! 解决方法:Cocoapods使用链接:http://www.jianshu.com/p/ff9030141411

Win7 windows update更新失败 正在还原 无法开机 双系统下的解决方案

系统环境:win7 + Ubuntu 12.04 双系统 解决时间:2014年12月1日 前提: 反复强行关机后开机仍显示“windows update更新失败 正在还原” 开机高级选项菜单选择“安全模式”,安全模式也显示“windows update更新失败 正在还原” 开机高级选项菜单选择“最近一次的正确配置”,之后还是显示“windows update更新失败 正在还原” 手头无安装盘,又嫌U盘做启动盘太麻烦 1.开机,进入ubuntu系统(linux的文件系统是可以识别windows系统

update更新两个字段

update更新两个字段时的sql语句: update tj_record set is_recycle_reprint_guide='1' , recycle__guide_date=now() where id = #{record_id} 科室如果我将字段的","写成了and也不报错.但是更新不了.如图: 切记,更新多个字段时是以逗号分隔. update更新两个字段

如何破解Windows Update更新出错难题

一.如果你参加了"windows 预览体验计划"的话,接下来的日子里老是会出现恼人的Windows Update更新出现80073712错误的问题(其它出错代号请认真百度出错代号对症下药,直到找合适的处理办法多练习几次就会了),特别是笔记本电脑使用win10预览版测试尝鲜,自然要承担系统不稳定易出错风险,"绿屏"会是常见的事,建议将体验计划切换为"慢速"稳定版,或者直接下载正式发布版Win10镜像文件干净安装最新版本Win10 破解方法是:先卸载

SQL中使用UPDATE更新数据时一定要记得WHERE子句

我们在使用 SQL 中的 UPDATE 更新数据时,一般都不会更新表中的左右数据,所以我们更新的数据的 SQL 语句中会带有 WHERE 子句,如果没有WHERE子句,就回更新表中所有的数据,在 mysql 中,我们可以设置sql_safe_updates 这个自带的参数来解决,,当该参数开启的情况下,我们必须在 UPDATE 语句后携带 WHERE 条件,否则就会报错.set sql_safe_updates=1; 表示开启该参数.下面是开启sql_safe_updates参数后不带  WHE

如何查看windows update更新代理版本

windows update更新代理最新版下载地址:https://support.microsoft.com/zh-cn/help/949104/how-to-update-the-windows-update-agent-to-the-latest-version 有关如何检查安装的 Windows 更新代理的版本的更多信息,请按下列步骤操作: 打开 %systemroot%\system32 文件夹. %systemroot% 是 Windows 的安装文件夹. 例如,%systemroo

Elasticsearch证书过期更新

elasticsearch证书过期更新. 1.查看ES证书状态 curl -XGET -u admin:passwd 'http://IP:9200/_license' { "license" : { "status" : "expired", "uid" : "ffe075ec-b906-450f-a614-e308310a032c", "type" : "trial&quo

yun update更新后 vm-workstation 找不到kernel

Centos7yum install -y kernel-devel-3.10.0-1062.el7.x86_64 Centos6yum install -y kernel-devel-2.6.32-754.25.1.el6.x86_64 yum update    更新内核kernel及各种软件 yum upgrade    只更新软件 原文地址:https://www.cnblogs.com/walkersss/p/12178038.html