先吐槽几句,最近本博主一直在做数据平台的事,越发觉得做数据平台难,尤其数据量很大的情况下,然而一旦问题解决,又马上觉得峰回路转,蛮有成就感。

下面就介绍一下,在已经存有大量数据的ES索引中(博主处理的大概在1亿7千万条),向一个type中添加一个新字段并赋给一个值。

说明,cimissgcdb是index,agmedays是type。

首先来查看一下原始的mapping:

GET /cimissgcdb/agmedays/_mapping 

查看一下该表数据量多大,心里有个底:

POST cimissgcdb/agmedays/_search/
{"query": {"match_all": {}}
}

然后添加一个新字段,并设置字段的数据类型(ES的数据类型比如Integer、String、Double、Date等),博主这里新增了一个date类型的时间字段TimeFormat,并进行了format:

PUT cimissgcdb/_mapping/agmedays
{"properties": {"TimeFormat": {"type": "date","format": "yyyy-MM-dd HH:mm:ss"}}
}

接下来给新字段赋值,有2种方式:

1. 使用painless

ES 5.0版本后推出painless。何为painless,推荐参考这2篇博文:

elasticsearch painless最强教程

elasticsearch painless最强教程 二

由于博主的ES用的还是低版本2.3.2的,所以第一种方法用不了,那只能使用第二种方式了。

2. 自己通过代码重写,由于博主的新字段值需要通过已经存在字段的值来计算,所以,自己动手写java api来实现。

public static void updateHourByScroll(String Type) throws IOException, ExecutionException, InterruptedException {System.out.println("scroll 模式启动!");Date  begin = new Date();SearchResponse scrollResponse = client.prepareSearch(Index).setTypes(TYPE).setSearchType(SearchType.SCAN).setSize(5000).setScroll(TimeValue.timeValueMinutes(1)).execute().actionGet();long count = scrollResponse.getHits().getTotalHits();//第一次不返回数据for(int i=0,sum=0; sum<count; i++) {scrollResponse = client.prepareSearchScroll(scrollResponse.getScrollId()).setScroll(TimeValue.timeValueMinutes(8)).execute().actionGet();sum += scrollResponse.getHits().hits().length;SearchHits searchHits = scrollResponse.getHits();List<UpdateRequest> list = new ArrayList<UpdateRequest>();for (SearchHit hit : searchHits) {String id = hit.getId();Map<String, Object> source = hit.getSource();if (source.containsKey("TimeFormat")) {   //这个很重要,如果中间过程失败了,在执行时,起到过滤作用,提高效率。System.out.println("TimeFormat已经存在!");}else{Integer year = Integer.valueOf(source.get("Year").toString());Integer month = Integer.valueOf(source.get("Mon").toString());Integer day = Integer.valueOf(source.get("Day").toString());Integer hour = 0;if(source.containsKey(""Hour"")){   //处理Hour不存在的情况hour = Integer.valueOf(source.get("Hour").toString());}else{hour = 0;}String time = getyear_month_day_hour(year, month, day, hour); //这个方法自定义,用来生成新字段TimeFormat的值,按需修改即可。System.out.println(time);UpdateRequest uRequest = new UpdateRequest().index(Index).type(Type).id(id).doc(jsonBuilder().startObject().field("TimeFormat", time).endObject());list.add(uRequest); //client.update(uRequest).get();  //注释上一行,就是单个提交,大数据量效率很低,用一个list来使用bulk,批量提高效率}}// 批量执行BulkRequestBuilder bulkRequest = client.prepareBulk();for (UpdateRequest uprequest : list) {bulkRequest.add(uprequest);}BulkResponse bulkResponse = bulkRequest.execute().actionGet();if (bulkResponse.hasFailures()) {System.out.println("批量错误!");}System.out.println("总量" + count + " 已经查到" + sum);}Date  end = new Date();System.out.println("耗时: "+(end.getTime()-begin.getTime()));
}

上面方法就对1亿7千万条数据重新查询然后写了一遍,用到Scroll游标查询。

对于游标查询和分页查看文章:Elasticsearch分页查询From&Size VS scroll

这样就完成了对一个已经存在的ES表新增字段并赋值,但是切记,这样的操作只是对表已经存在的历史记录的改变,对于新来的数据,要修改ES写入新字段的过程。

Elasticsearch新增一个字段并赋值相关推荐

  1. 在数据库中如何新增一个字段?

    工作中常会用到:交给测试时,会让交付新增的字段的SQL语句. 如何在数据库中新增一个字段: alter TABLE t_Execution(表名) add FIsModifyQuote(列名) int ...

  2. mysql表中指定位置新增一个字段

    在表test种,新增一个字段:status,并且status字段放在id后面 alter table + 表名 + add + 要添加的字段 字段类型 + (comment +注释+) after + ...

  3. mysql表 新增一个字段

    mysql表中在指定位置新增一个字段 原表结构,表名number 目的: 在字段numid 后新增一个name字段 alter table number add name varchar(100) c ...

  4. elasticsearch获取一个字段的值_Elasticsearch,你觉得自己懂了多少,看看这篇文章吧...

    Elasticsearch分析与检索功能实操 虽然通过文档_id可以获取到文档,但_id字段一般都是一个无意义的值,在实际应用中更多地是使用文档其它有意义字段做检索.Elasticsearch提供一个 ...

  5. mysql表内增加一个字段并赋值

    将spider增加source_pic字段并赋值为url字段 update spider a INNER JOIN (select * from spider) b on a.uid = b.uid  ...

  6. mpp新增一个字段_如何快速新增百万测试数据?

    柠檬班的APP上线之前,需要一百万个学员的信息进行压力测试. 那么数据从哪里来呢?直接找开发帮忙?可能会被他鄙视! 一条一条去insert?嗯,算了下大概需要20年! 不用怕,Happy老师接下来教你 ...

  7. MySQL给一个字段递增赋值

    https://blog.csdn.net/kriszhang/article/details/72125203 首先设置一个变量,初始值为0: set @r:=0; 1 然后更新表中对应的ID列: ...

  8. mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...

    自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...

  9. oracle中新增一列赋值,给List里添加一字段并赋值 | 学步园

    有这么个问题,oracle查出来数据如下: ID NAME DAY 001 路径1 28 002 路径2 26 003 路径3 29 004 路径4 24 ... ... ... 现想在 这个 Lis ...

最新文章

  1. CSS常见布局解决方案
  2. django中聚合aggregate和annotate GROUP BY的使用方法
  3. Xtreme SuitePro ActiveX 2008 v12.0.1 更新了
  4. ASP.NET MVC的Action拦截器(过滤器)ActionFilter
  5. SpringBoot实战之SpringBoot自动配置原理
  6. eclipse 创建ssm spring+springmvc+mybatis 实现登录注册
  7. iOS开发周报-- 第一期
  8. C++OpenCV:三角形插值、线面的交点
  9. @SpringBootApplication与@EnableAutoConfiguration区别
  10. 函数指针实现无类型打印
  11. 洛谷P3378 【模板】堆
  12. Linux源码安装pgadmin4,如何在CentOS 7中安装pgAdmin4(yum 安装方法)
  13. 微积分英文书籍第八版 CALCULUS eight edition
  14. 深度学习-8.实践方法论
  15. Android图片轮播控件 如果对你有帮助请star哦!
  16. 时间格式转换,转时间戳,转UTC,转中国标准时间
  17. 利用Python进行数据分析笔记-pandas建模(statsmodels篇)
  18. 无尽神域服务器维护,关于对无尽神域的感受亲爱的无尽神域开发团队:
  19. 数控木工机械和精美家具制作
  20. bd09转wgs84 java_各种坐标系互相转换(WGS84转换BD-09主要)

热门文章

  1. 操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)
  2. 【最详细解析】1070 结绳 (25分)_18行代码AC
  3. 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)
  4. android最新版本 note8,三星Note8官方国行版安卓9固件rom升级包:CHC-N9500ZCS4DSF5
  5. 新手坐高铁怎么找车厢_京沪高铁设置静音车厢,你怎么看?
  6. 专科学历事业单位工资计算机,事业单位人来告诉你:学历跟入编之后待遇关系有多大!很直接...
  7. fastreport 旋转90度_水冷必不可少之90度弯头
  8. vst3插件_2B Played Music发布用于劲爆舞曲风格的极端失真和剪辑插件2B Clipped XT
  9. 安卓模拟器运行python_利用python+Appium 之 如何在设备(模拟器)上自动安装并启动APP...
  10. python在汽车上的应用_python实现图片识别汽车功能