Java实现对ES数据的新增,删除,修改,及合并

新增数据

代码:

   @Autowired
private RestHighLevelClient client;
/**
* @description ES写入数据
* @author zae
* @date 2022/1/13 14:40
* @param index 索引库
* @param dataList 数据集合(size为插入数据的条数)
*/
public void insertEsData(String index,List<Map<String,Object>> dataList) {
BulkProcessor bulkProcessor = null;
try {
bulkProcessor = getBulkProcessor(client);
for(Map<String,Object> dataMap:dataList){
bulkProcessor.add(new IndexRequest(index).source(dataMap));
}
// 将数据刷新到ES中
bulkProcessor.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
boolean terminatedFlag = bulkProcessor.awaitClose(150L,
TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private BulkProcessor getBulkProcessor(RestHighLevelClient client) {
BulkProcessor bulkProcessor = null;
try {
BulkProcessor.Listener listener = new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
logger.info("Try to insert data number : "
+ request.numberOfActions());
} @Override
public void afterBulk(long executionId, BulkRequest request,
BulkResponse response) {
logger.info("************** Success insert data number : "
+ request.numberOfActions() + " , id: " +
executionId);
} @Override
public void afterBulk(long executionId, BulkRequest request,
Throwable failure) {
logger.error("Bulk is unsuccess : " + failure + ", executionId: " + executionId);
}
};
BiConsumer<BulkRequest, ActionListener<BulkResponse>> bulkConsumer =
(request, bulkListener) -> client
.bulkAsync(request, RequestOptions.DEFAULT, bulkListener);
BulkProcessor.Builder builder = BulkProcessor.builder(bulkConsumer,
listener);
builder.setBulkActions(5000);//刷新条数
builder.setBulkSize(new ByteSizeValue(100L, ByteSizeUnit.MB));// 刷新大小
builder.setConcurrentRequests(10);//并发线程数
builder.setFlushInterval(TimeValue.timeValueSeconds(100L));// 时间频率
builder.setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1L), 3));//重试补偿策略
bulkProcessor = builder.build();
} catch (Exception e) {
e.printStackTrace();
try {
bulkProcessor.awaitClose(100L, TimeUnit.SECONDS);
} catch (Exception e1) {
logger.error(e1.getMessage());
}
}
return bulkProcessor;
}

注意点:

  • 传入数据中的List中的每个Map为一条数据,Map中的key为字段Field,value为值。

  • 假如在插入数据前index库中没有定义Field及映射关系,在插入数据时会自动新增字段Field,字段的类型会默认映射为value值的类型。

  • 假如新插入的数据和之前第一次插入的数据类型不一致,(相同的key但是value的类型不一样),这样在执行代码时可能不会报错失败,但是实际上并没有插入数据成功。

删除数据

代码

/**
* @description ES数据删除
* @author zae
* @date 2022/1/13 17:14
* @param index 索引库
* @param id 数据id
*/
public void delete(String index,String id){
DeleteRequest deleteRequest = new DeleteRequest(index,id);
DeleteResponse response = null;
try {
response = client.delete(deleteRequest,RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(response);
}

删除的话直接指定索引库和要删除的数据的id进行删除,至于数据的id怎么获取,参考下面更新数据中的代码。

更新数据

直接修改

 /**
* @description ES数据更新
* @author zae
* @date 2022/1/13 16:10
* @param index 索引库
* @param key 字段名
* @param value 更新后的值
* @param id 需要修改的那条数据的id
*/
public void update(String index,String key,Object value,String id){
try {
UpdateRequest request = new UpdateRequest();
request.index(index) //索引名
.id(id)//id
.doc(
XContentFactory.jsonBuilder()
.startObject()
.field(key, value)//要修改的字段 及字段值
.endObject()
);
UpdateResponse response= client.update(request,RequestOptions.DEFAULT);
System.out.println(response.status());
} catch (Exception e) {
e.printStackTrace();
}
}
  • 更新数据需要传入指定的索引库,需要修改的字段名称,修改后的value值,以及代表那条数据的唯一id

  • 关于唯一id怎么获得,可以参考以下代码。

     public void selectAndUpdate(){
    int count = 0;
    //step1:根据条件获取需要修改的数据的id
    SearchHit[] searchHits = esDeal.selectIdByKey(PRODUCT_DEV_INDEX, "name"); // step2:遍历更新查询出来的数据
    for (SearchHit searchHit : searchHits) {
    // 获取到单条记录的id
    String id = searchHit.getId();
    //调用更新数据的核心方法
    esDeal.update(PRODUCT_DEV_INDEX,"name","张三",id);
    count++;
    }
    System.out.println("一共更新了"+count+"条数据");
    } public SearchHit[] selectIdByKey(String index,String key){
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(QueryBuilders.existsQuery(key));
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(boolQueryBuilder)
    .trackTotalHits(true)
    .size(22); SearchRequest searchRequest = new SearchRequest()
    .indices(index)
    .source(sourceBuilder);
    try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHit[] hits = searchResponse.getHits().getHits();
    return hits;
    } catch (IOException e) {
    e.printStackTrace();
    }
    return null;
    }

数据合并

数据合并其实也是更新的一种,关键在于怎么提取及封装需要更新的数据,根据业务场景的不同达到合并的效果,以上面的图片为例,我需要将以上数据的20004.value里面的值合并上新的数据却也保留着原有的数据。

    @Test
public void selectAndUpdate(){
int count = 0;
//step1:根据条件获取需要修改的数据的id
SearchHit[] searchHits = esDeal.selectIdByKey(PRODUCT_DEV_INDEX, "20004.value");
for (SearchHit searchHit : searchHits) {
String id = searchHit.getId();
// step2:组装数据
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
List<Map<String,Object>> mapList = (List<Map<String, Object>>) sourceAsMap.get("20004");
Map<String, Object> mapData = mapList.get(0);
// 获取之前20004.value的数据,并添加上新的数据
List value = (List) mapData.get("value");
value.add("120021");
value.add("3990993");
mapData.put("value",value);
// step3:根据id更新数据
esDeal.update(PRODUCT_DEV_INDEX,"20004",mapList,id);
count++;
}
System.out.println("一共更新了"+count+"条数据");
}

备注:

  • 代码中调用的selectIdByKey()以及update()在更新数据的第一部分都有代码,直接使用就好。根据以上代码更新后的数据为:

  • 在更新20004.value的值时,不需要保持和20004.value的原有数据类型一致,更新成其他类型也是可以的,这点和插入key:value的数据是有区别的。

Java实现对ES数据的新增,删除,修改,及合并的更多相关文章

  1. C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查

    前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...

  2. Java实现对zip和rar文件的解压缩

    通过java实现对zip和rar文件的解压缩

  3. Easyui datagrid绑定数据,新增,修改,删除方法(一)

    @{ ViewBag.Title = "UsersList"; } <script type="text/javascript"> $(functi ...

  4. Easyui datagrid绑定数据,新增,修改,删除写法

    @{ ViewBag.Title = "xw_xsfl"; } <script type="text/javascript"> var editIn ...

  5. Java 实现对Sql语句解析

    原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...

  6. 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(四)

    @{ ViewBag.Title = "xxlist"; } <script type="text/javascript" language=" ...

  7. Java实现对Mysql的图片存取操作

    1.MySQL中的BLOB类型 Mysql中可以存储大文件数据,一般使用的BLOB对象.如图片,视频等等. BLOB是一个二进制大对象,可以容纳可变数量的数据.因为是二进制对象,所以与编码方式无关.有 ...

  8. js实现对json数据的序列化(兼容ie6以上浏览器)

    /** * 增加对JSON数据的序列化方法, * 主要用于IE6.7不支持JSON对象的浏览器 */ var xue = xue || {};xue.json = xue.json || {}; xu ...

  9. Java实现对ftp的读写文件

    这里仅仅是对ftp工具类的简单使用,很多东西还不是很了解.当然学以致用,先用到这里吧. public class FtpTest { /** * 向ftp写文件(数据) */ @Test public ...

  10. Java实现对cookie的增删改查

    原文地址:http://blog.csdn.net/k21325/article/details/54377830 @RequestMapping(value="meeting/addGua ...

随机推荐

  1. 使用Navicat 进行MySql数据库同步功能

    使用Navicat 进行MySql数据库同步功能 作者:胡德安 准备: 打开Navicat管理工具(比如Navicat Premium 15管理工具) 两个数据库第一个是源数据库A和要被同步的目标数据 ...

  2. 从零开始配置 vim(11)——插件管理

    之前我们介绍了基础配置部分和快捷键配置部分.如果你配置了这两个部分,vim已经算是比较好用了.但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心.vim比较强大的一点 ...

  3. 大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解

    大语言模型的预训练[2]:GPT.GPT2.GPT3.GPT3.5.GPT4相关理论知识和模型实现.模型应用以及各个版本之间的区别详解 1.GPT 模型 1.1 GPT 模型简介 在自然语言处理问题中 ...

  4. 3.1 Windows驱动开发:内核远程堆分配与销毁

    在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了ZwAllocateVirtualMemory这 ...

  5. 46从零开始用Rust编写nginx,数据还能这么传,多层代理(IP多级代理)搭建

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  6. Data Encryption Standard算法:历经考验的经典加密方案

    在当今数字化时代,数据安全是一个至关重要的问题.为了保护敏感数据的机密性和完整性,加密算法成为了数据保护的关键技术.其中,DES(Data Encryption Standard)算法作为一种经典的对 ...

  7. 零基础入门学习Java课堂笔记 ——day01

    Java语法 1.注释.标识符.关键字 注释 不会被程序执行的代码或者块 //双斜杠表示单行注释 /*表示多行注释*/ 标识符.关键字 关键词系统事先定义好的,我们能直接拿来用的,不能作为变量名使用 ...

  8. HBase-通过外部表将Hive数据写入到HBase

    a) 准备测试数据 这里准备的csv文件data_test.csv,内容没用''包裹,逗号作为列分隔符 171301,燕青,男,27,发展部 171207,武松,男,39,开发部 171307,李逵, ...

  9. STC MCU的软件和硬件PCA/PWM输出

    软件方式输出PWM PWM用于输出强度的控制, 例如灯的亮度, 轮子速度等, STC89/90系列没有硬件PWM, 需要使用代码模拟 使用纯循环的方式实现PWM 非中断的实现(SDCC环境编译) #i ...

  10. updatedb命令

    updatedb命令 updatedb创建或更新locate命令使用的数据库,如果数据库已经存在,则重用其数据以避免重新读取未更改的目录,updatedb通常由cron每天运行以更新默认数据库. 语法 ...