elasticsearch批量操作之bulk


前言

本篇文章主要总结如何使用bulk对es进行批量操作,若有不足请教大神门在评论区多多补充。

一、bulk概述

1.1 基础概念

bulk是es提供的一种批量增删改的操作API。

1.2 bulk语法

bulk对JSON串的有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是\n;Window下是\r\n)。bulk的每个操作必须要一对JSON串(delete语法除外)

例如若增加一个文档如下所示:

POST _bulk
{"create": {"_index": "example", "_type": "docs", "_id": 11}}
{"name": "test_bulk", "counter":"100"}

1.3 操作类型

  • create 如果文档不存在就创建,但如果文档存在就返回错误
  • index 如果文档不存在就创建,如果文档存在就更新
  • update 更新一个文档,如果文档不存在就返回错误
  • delete 删除一个文档,如果要删除的文档id不存在,就返回错误

从以上可以看出index是比较常用的,因为bulk操作失败不会影响其他文档操作,我们可以从他的返回结果中查看失败的详细原因。

二、使用示例

为了大家更快掌握使用方法,我们直接上代码

2.1 批量插入

代码如下(示例):

public void importData(){
   List<Map<String, Object>> list = new ArrayList<>();
   for (int i = 0; i < 10; i++) {
       Map<String, Object> map = new HashMap<>();
       map.put("name", "金手杖按摩会所");
       map.put("id", i);
       list.add(map);
   }
   handleData
}

private void handleData(List<Map<String, Object>> list) {
    BulkRequest request = new BulkRequest();
    for (int i = 0; i < list.size(); i++) {
        Map<String, Object> map = list.get(i);
        request.add(new IndexRequest("indexName").id(String.valueOf(map.get("id"))).source(map, XContentType.JSON));
    }
    try {
        client.bulk(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.2 批量更新

这里我们根据id批量更新其中的name

public void updateNameByIds(List<String> ids) {
	//这里我们把所有要更新的name统一更新为:大众洗浴
    BulkRequest request = new BulkRequest();
    // 更新热度值
    for (String id : ids) {
        //使用map集合存储我们要修改的字段和要修改的数据
        Map<String, Object> map = new HashMap<>();
        map.put("name", "大众洗浴");
        //第一个参数是索引,第二个参数是id,然后使用doc来放我们要修改的数据和集合
        request.add(new UpdateRequest("indexName", id).doc(map));
    }
    //批量更新操作
    try {
        restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        LOGGER.error("更新失败:" + e.getMessage());
    }
}

2.3 批量删除

代码如下(示例):

public void deleteByIds(List<String> ids) {
    BulkRequest request = new BulkRequest();
    // 更新热度值
    for (String id : ids) {
        //第一个参数是索引,第二个参数是id,然后使用doc来放我们要修改的数据和集合
        request.add(new DeleteRequest("indexName", id));
    }
    //批量删除操作
    try {
        restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    } catch (IOException e) {
        LOGGER.error("删除失败:" + e.getMessage());
    }
}

如果想根据指定条件进行删除我们也可以使用以下操作,但其删除比较慢:

public void deleteByKindId(String indexName,String name)throws Exception{
    DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);
    
    deleteByQueryRequest.setQuery(QueryBuilders.termsQuery("name", name));
    
    remoteHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了bulk的使用,在数据量比较大的时候我们通常再结合游标的方式分批进行插入。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走进IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值