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  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章