Elasticsearch新增一个字段并赋值
先吐槽几句,最近本博主一直在做数据平台的事,越发觉得做数据平台难,尤其数据量很大的情况下,然而一旦问题解决,又马上觉得峰回路转,蛮有成就感。
下面就介绍一下,在已经存有大量数据的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新增一个字段并赋值相关推荐
- 在数据库中如何新增一个字段?
工作中常会用到:交给测试时,会让交付新增的字段的SQL语句. 如何在数据库中新增一个字段: alter TABLE t_Execution(表名) add FIsModifyQuote(列名) int ...
- mysql表中指定位置新增一个字段
在表test种,新增一个字段:status,并且status字段放在id后面 alter table + 表名 + add + 要添加的字段 字段类型 + (comment +注释+) after + ...
- mysql表 新增一个字段
mysql表中在指定位置新增一个字段 原表结构,表名number 目的: 在字段numid 后新增一个name字段 alter table number add name varchar(100) c ...
- elasticsearch获取一个字段的值_Elasticsearch,你觉得自己懂了多少,看看这篇文章吧...
Elasticsearch分析与检索功能实操 虽然通过文档_id可以获取到文档,但_id字段一般都是一个无意义的值,在实际应用中更多地是使用文档其它有意义字段做检索.Elasticsearch提供一个 ...
- mysql表内增加一个字段并赋值
将spider增加source_pic字段并赋值为url字段 update spider a INNER JOIN (select * from spider) b on a.uid = b.uid ...
- mpp新增一个字段_如何快速新增百万测试数据?
柠檬班的APP上线之前,需要一百万个学员的信息进行压力测试. 那么数据从哪里来呢?直接找开发帮忙?可能会被他鄙视! 一条一条去insert?嗯,算了下大概需要20年! 不用怕,Happy老师接下来教你 ...
- MySQL给一个字段递增赋值
https://blog.csdn.net/kriszhang/article/details/72125203 首先设置一个变量,初始值为0: set @r:=0; 1 然后更新表中对应的ID列: ...
- mpp新增一个字段_mybatisplus使用@InsertFill和@UpdateFill注解设置自定义sql对字段自动填充...
自动填充优化功能 原生mybatisplus只能做%s+1和now两种填充,mybatisplus-plus在插入或更新时对指定字段进行自定义复杂sql填充. 需要在实体类字段上用原生注解@Table ...
- oracle中新增一列赋值,给List里添加一字段并赋值 | 学步园
有这么个问题,oracle查出来数据如下: ID NAME DAY 001 路径1 28 002 路径2 26 003 路径3 29 004 路径4 24 ... ... ... 现想在 这个 Lis ...
最新文章
- CSS常见布局解决方案
- django中聚合aggregate和annotate GROUP BY的使用方法
- Xtreme SuitePro ActiveX 2008 v12.0.1 更新了
- ASP.NET MVC的Action拦截器(过滤器)ActionFilter
- SpringBoot实战之SpringBoot自动配置原理
- eclipse 创建ssm spring+springmvc+mybatis 实现登录注册
- iOS开发周报-- 第一期
- C++OpenCV:三角形插值、线面的交点
- @SpringBootApplication与@EnableAutoConfiguration区别
- 函数指针实现无类型打印
- 洛谷P3378 【模板】堆
- Linux源码安装pgadmin4,如何在CentOS 7中安装pgAdmin4(yum 安装方法)
- 微积分英文书籍第八版 CALCULUS eight edition
- 深度学习-8.实践方法论
- Android图片轮播控件 如果对你有帮助请star哦!
- 时间格式转换,转时间戳,转UTC,转中国标准时间
- 利用Python进行数据分析笔记-pandas建模(statsmodels篇)
- 无尽神域服务器维护,关于对无尽神域的感受亲爱的无尽神域开发团队:
- 数控木工机械和精美家具制作
- bd09转wgs84 java_各种坐标系互相转换(WGS84转换BD-09主要)
热门文章
- 操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)
- 【最详细解析】1070 结绳 (25分)_18行代码AC
- 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)
- android最新版本 note8,三星Note8官方国行版安卓9固件rom升级包:CHC-N9500ZCS4DSF5
- 新手坐高铁怎么找车厢_京沪高铁设置静音车厢,你怎么看?
- 专科学历事业单位工资计算机,事业单位人来告诉你:学历跟入编之后待遇关系有多大!很直接...
- fastreport 旋转90度_水冷必不可少之90度弯头
- vst3插件_2B Played Music发布用于劲爆舞曲风格的极端失真和剪辑插件2B Clipped XT
- 安卓模拟器运行python_利用python+Appium 之 如何在设备(模拟器)上自动安装并启动APP...
- python在汽车上的应用_python实现图片识别汽车功能