ElasticSearch(ES)JAVA批量更新批量插入——就一步

注:此Es处理方式是基于Spring-data 集成的

1. 批量更新

 

 public void allChangeCart(CartsSearchDTO cartsSearchDTO) {
        Assert.notNull(cartsSearchDTO, "对象不能为空!");
        UpdateByQueryRequestBuilder updateByQueryRequestBuilder = UpdateByQueryAction.INSTANCE.newRequestBuilder(elasticsearchTemplate.getClient());
        updateByQueryRequestBuilder.source("shop_cart_index");
        updateByQueryRequestBuilder.filter(QueryBuilders.termQuery("goodsId", cartsSearchDTO.getGoodsId()));
        updateByQueryRequestBuilder.script(
                new Script("ctx._source.goodsShow="+cartsSearchDTO.getGoodsShow()
                        +";ctx._source.goodsPrice="+cartsSearchDTO.getGoodsPrice()
                        +";ctx._source.goodsImages='"+cartsSearchDTO.getGoodsImages()
                        +"';ctx._source.goodsState="+cartsSearchDTO.getGoodsState()
                        +";ctx._source.oldGoodsPrice="+cartsSearchDTO.getOldGoodsPrice()
                        +";ctx._source.goodsTransfeeCharge="+cartsSearchDTO.getGoodsTransfeeCharge()
                        +";ctx._source.isIntereFree="+cartsSearchDTO.getIsIntereFree()
                        +";ctx._source.goodsNowStorage="+cartsSearchDTO.getGoodsNowStorage()
                        +";ctx._source.goodsName='"+cartsSearchDTO.getGoodsName()+"';"));
        long count =updateByQueryRequestBuilder.get().getUpdated();
        log.info("更新了:" + count + "条");

    }

简要说明:

1.source 为索引名称

2.filter 为条件(不理解的同学 可以理解为sql的where 条件)

3.script 为更新内容 切记若为字符类型需要加单引号 “ ' ” 拼接

4.count 为受影响条数

2.批量插入:

    @Override
    public void batchSave(List<GoodsSpecSearchDTO> goodsSpecSearchDTOList) {
        Assert.notNull(goodsSpecSearchDTOList, "新增的商品规格集合不能为空!");

        // 获取索引文档对象
        Document document = GoodsSpecSearchPO.class.getAnnotation(Document.class);

        // 判断索引是否存在
        if (!elasticsearchTemplate.indexExists(document.indexName())) {
            elasticsearchTemplate.createIndex(document.indexName());
        }
        List<IndexQuery> queries = new ArrayList<>();

        goodsSpecSearchDTOList.forEach(goodsSpecSearchDTO -> {
            GoodsSpecSearchPO goodsSpecSearchPO = new GoodsSpecSearchPO();
            IndexQuery indexQuery = new IndexQuery();
            try {
                GoodsSpecSearchConverter.convert(goodsSpecSearchDTO, goodsSpecSearchPO);
                indexQuery.setId(goodsSpecSearchDTO.getGoodsSpecId());
                indexQuery.setObject(goodsSpecSearchPO);
                indexQuery.setIndexName(document.indexName());
                indexQuery.setType(document.type());
                queries.add(indexQuery);
                log.info("新增商品规格ID:{}", goodsSpecSearchDTO.getGoodsSpecId());
            } catch (Exception e) {
                log.error("生成商品规格{}索引异常:{}", goodsSpecSearchDTO.getGoodsSpecId(), e);
            }
        });
        elasticsearchTemplate.bulkIndex(queries);
        elasticsearchTemplate.refresh(document.indexName());
        log.info("已新增{}条类型规格索引", goodsSpecSearchDTOList.size());
    }

 

简要说明:

先获取对象的反射属性以xml格式形式解析,利用索引条件(indexQuery)进行汇总集合的形式,最终以ES原生Template批量插入()(bulkIndex)并刷新索引(refresh)

以上解决方案有疑问或者优化点 欢迎与博主留言 一起探讨进步!

转载请说明出处  https://blog.csdn.net/PanZiHao_BeiJing  

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Elasticsearch 6.5.4 中,可以使用 Java API 批量插入数据。下面是一个示例代码: ```java import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.rest.RestStatus; import java.io.IOException; import java.util.List; public class ElasticsearchBulkInsert { private static final String INDEX_NAME = "my_index"; private static final String TYPE_NAME = "_doc"; public static void bulkInsert(RestHighLevelClient client, List<String> documents) throws IOException { BulkRequest bulkRequest = new BulkRequest(); for (String document : documents) { IndexRequest indexRequest = new IndexRequest(INDEX_NAME, TYPE_NAME); indexRequest.source(document, XContentType.JSON); bulkRequest.add(indexRequest); } try { BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT); if (bulkResponse.hasFailures()) { // 处理错误 for (BulkItemResponse bulkItemResponse : bulkResponse) { if (bulkItemResponse.isFailed()) { BulkItemResponse.Failure failure = bulkItemResponse.getFailure(); String id = bulkItemResponse.getId(); String message = failure.getMessage(); RestStatus status = failure.getStatus(); // 处理错误 } } } } catch (IndexNotFoundException e) { // 处理索引不存在异常 } } } ``` 在上面的代码中,我们首先创建了一个 `BulkRequest` 对象,然后循环要插入的文档,将每个文档构造成一个 `IndexRequest` 对象,并调用 `bulkRequest.add()` 方法将其添加到 `BulkRequest` 中。最后,调用 `client.bulk()` 方法执行批量插入操作。 要注意的是,如果批量插入过程中出现错误,可以通过检查 `BulkResponse` 对象中的 `hasFailures()` 方法来判断是否存在错误。如果存在错误,可以通过遍历 `BulkItemResponse` 对象来处理每个文档的错误信息。如果在批量插入时发现索引不存在,可以捕获 `IndexNotFoundException` 异常并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值