注:此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)
以上解決方案有疑問或者優化點 歡迎與博主留言 一起探討進步!