一、前言
最近工作中有这样一个ElasticSearch(以下简称ES)写入的场景,Flink解决完数据实时写入ES。当初须要将一批历史数据通过Flink加载到到ES,有两个点须要保障:
- 对于历史数据,ES已有文档,则舍弃旧数据,ES没有则插入历史数据。
- 对于新数据,能对现有的ES数据进行更新。
参考ElasticSearch进阶篇(一)--版本控制,能够应用ES的版本实现该需要的开发。
二、代码实现及验证
代码实现
申请写数据时退出version和version_type参数,次要代码如下:
IndexRequest indexRequest = Requests.indexRequest() .index(indexName) .id("1") // 指定版本比拟的业务字段,具体业务具体分析,个别取工夫戳较为适合 .version(Long.parseLong(dataMap1.get("create").toString())) // 指定应用内部版本号 .versionType(VersionType.EXTERNAL) .source(dataMap);
验证
验证demo可应用以后工夫的工夫戳作为版本比拟根据。验证思路如下:
- 运行demo程序,在以后工夫戳下,插入一条数据,通过kibana等工具测验数据是否插入胜利。并记录以后的工夫戳。
- 更改某些字段值对数据进行更新,再次运行程序,测验数据是否更新胜利。
- 将工夫版本比拟的字段值固定为第一次执行程序的工夫戳,测验数据是否更新胜利。
验证后果如下图:
三、总结
由截图可看到,第一步和第二步都能执行胜利,第三步执行会呈现版本抵触的异样,依据提醒很不便能辨认出起因,即ElasticSearch进阶篇(一)--版本控制中得出的论断,应用version和version_type=EXTERNAL进行版本控制时,只有要写入文档的版本号大于已有文档的版本号能力更新胜利。
案例代码参考:elasticsearch_demo