追加更新,学名不知道叫啥,我这里指在历史数据的基础上,追加数据更新。比如 价格数据,我在价格字段里面保存了一个每天价格的数组,追加更新的时候在数组的后面直接add,而不是像一般情况那样覆盖。

ES追加更新采用painless脚本来实现。

1. 准备

第一步, 新建索引,创建mapping

### 创建 v0_test 的 map
PUT {{host}}/{{index}}/_mapping
content-type: application/json {
"properties": {
"nid": {
"type": "keyword"
},
"price": {
"type": "text"
},
"quantity":{
"type":"integer"
},
"tags" : {
"type": "keyword"
}
}
}

nid 是作为id查询详情使用;

price 字段这里设为text类型,用于测试 字符串 追加;

quantity 字段设为integer,用于测试 整型数组 追加;

tags 设为keyword, 用于测试 字符串数组 追加。

第二步,创建测试数据

测试数据1:

### 创建一条数据
POST {{host}}/{{index}}/_doc
content-type: application/json {
"nid":"9",
"price":"10.0,11.0,13.2",
"quantity":[9,13],
"tags" : ["red", "blue"]
}

数据1各个字段都已经初始化。

看一下入库结果:

测试数据2:

### 创建一条数据
POST {{host}}/{{index}}/_doc
content-type: application/json {
"nid":"10",
"price":"10.0,11.0,13.2"
}

测试数据2数组quantity 和 tags 没有初始化。

入库结果:

2. 文本追加更新

这里用测试数据2做文本追加更新实验:

### 文本 追加更新
POST {{host}}/{{index}}/_update_by_query
content-type: application/json {
"query": {
"term":{
"nid":"10"
}
},
"script": {
"lang": "painless",
"inline": "ctx._source.price = ctx._source.price + params.newprice",
"params": {
"newprice": ",15.0"
}
}
}

这里再price后追加了一个字符串  “,15.0”

追加结果:

可以看到price后面已经成功追加了

3. 数组追加更新

数组追加更新先尝试已经初始化的数组,用测试数据1

### 数组 追加更新
POST {{host}}/{{index}}/_update_by_query
content-type: application/json {
"query": {
"term":{
"nid":"9"
}
},
"script": {
"lang": "painless",
"inline": "ctx._source.quantity.add(params.newparam)",
"params": {
"newparam": 43
}
}
}

在quantity字段的后面追加 一个 43

追加结果:

然后我们用测试数据2试试追加更新数组,测试数据2的数组字段是没有初始化的,测试数据2的nid是 10

结果报错了。

修改一下脚本:

### 空数组 追加更新
POST {{host}}/{{index}}/_update_by_query
content-type: application/json {
"query": {
"term":{
"nid":"8"
}
},
"script": {
"lang": "painless",
"inline": "if (!(ctx._source.quantity instanceof List)) {ctx._source.quantity = [params.newparam]} else ctx._source.quantity.add(params.newparam)",
"params": {
"newparam": 43
}
}
}

添加一个是否为List的判断,再追加更新

成功更新。

然后我们同样用这个办法来追加更新字符串数组:

### 空字符串数组 追加更新
POST {{host}}/{{index}}/_update_by_query
content-type: application/json {
"query": {
"term":{
"nid":"10"
}
},
"script": {
"lang": "painless",
"inline": "if (!(ctx._source.tags instanceof List)) {ctx._source.tags = [params.newparam]} else ctx._source.tags.add(params.newparam)",
"params": {
"newparam": "颜色"
}
}
}

更新结果:

依旧是成功的。

painless 脚本语言教程: https://www.elastic.co/guide/en/elasticsearch/painless/7.2/painless-lang-spec.html


Elasticsearch 追加更新的更多相关文章

  1. elasticsearch【更新】操作

    基于上一篇博文基础上,进行es的操作,document的新增比较简单,就不说了,这里主要说说更新操作. 更新操作,有两大类,一个是Replace,一个是Update,就是说一个是替换,一个是更新. 替 ...

  2. Elasticsearch之更新(全部更新和局部更新)

    前面的基础, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 Elasticsearch之curl创建索引库和索引时注意事项 Elasticsearch之 ...

  3. 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的

    背景 ElasticSearch 的使用度越来越普及了,很多公司都在使用.有做日志搜索的,有做商品搜索的,有做订单搜索的. 大部分使用场景都是通过程序定期去导入数据到 ElasticSearch 中, ...

  4. .net core Elasticsearch 查询更新

    记录一下: 数据结构如下: public class ESUserTransaction { public long AccountId { get; set; } public string Var ...

  5. Elasticsearch之更新

    public class UpdateElasticAPI { private static RestClient restClient; static { restClient=RestClient ...

  6. [Elasticsearch] ES更新问题踩坑记录

    问题描述 我们有个系统设计的时候针对Hive创建表.删除表, 需要更新ES中的一个状态,标记是否删除,在几乎同时执行两条下面的语句的时候,发现在ES 中出现表即使被创建了还是无法被查询到的情况,针对该 ...

  7. elasticsearch更新操作问题

    elasticsearch在更新的时候,是通过id进行管理的,我们在前台传入id操作,id如果与elasticsearch相同,则覆盖,否则新增一条记录.且elasticsearch中的插入一条记录和 ...

  8. elasticsearch 大集群,双重别名,滚动更新分词方案

    elasticsearch 滚动更新分词 国内用ik.hanlp.ansj或基于其二次开发的比较多 必然有分词变更的操作(主要是是加词) reindex+别名可以解决一部分问题,但在大集群上会影响业务 ...

  9. Elasticsearch索引(company)_Centos下CURL增删改

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...

随机推荐

  1. MySQL分组排序(取第一或最后)

    MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...

  2. 3、组件注册-@ComponentScan-自动扫描组件&指定扫描规则

    3.组件注册-@ComponentScan-自动扫描组件&指定扫描规则 3.1 xml方式 benas.xml 导入context命名空间 <?xml version="1.0 ...

  3. P4160 [SCOI2009]生日快乐 搜索

    思路:无脑搜索 提交:1次 题解: 大力搜索,枚举每个状态\((x,y,l)\)(\(x\)指分配到的长(可能比\(y\)要短),\(y\)指分配到的宽(可能比\(x\)要长),\(l\)指剩余切的次 ...

  4. 002_STM32程序移植之_DHT11

    1. 测试环境:STM32C8T6 2. 测试模块:DHT11温湿度模块 3. 测试接口: 1. DHT11温湿度模块接口: DS1302引脚 ---------单片机引脚 VCC---------- ...

  5. python 将IP地址转换成打包后的32位格式

    python 2.7 #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - # This program r ...

  6. masm 编译贪吃蛇游戏

    code: ;TITLE GAME4TH PAGE , STSEG SEGMENT DB DUP () STSEG ENDS ;----------------------------------- ...

  7. Hdu5762

    Hdu5762 题意: 你n个点,让你找两个数对,A,B和C,D,使得A和B的曼哈顿距离等于C和D的曼哈顿距离,问是否存在这样的对,A!=C且B!=D. 解法: 直接暴力判断,时间复杂度是 $ O(n ...

  8. 【Python】使用Beautiful Soup等三种方式定制Jmeter测试脚本

    背景介绍 我们在做性能调优时,时常需要根据实际压测的情况,调整线程组的参数,比如循环次数,线程数,所有线程启动的时间等. 如果是在一台Linux机器上,就免不了在本机打开图形页面修改,然后最后传递到压 ...

  9. Postgresql - MATERIALIZED VIEW

    MATERIALIZED VIEWPG 9.3 版本之后开始支持物化视图.View 视图:虚拟,不存在实际的数据,在查询视图的时候其实是对视图内的表进行查询操作. 物化视图:实际存在,将数据存成一张表 ...

  10. Qt 线程基础(QThread、QtConcurrent等) 2

    使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...