当前位置:   article > 正文

elasticsearch 实现选择更新 selectColumn update_elasticsearchrepository update

elasticsearchrepository update

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

 


前言

为了支持更复杂的条件查询,再日益膨胀的数据下提供高性能查询,elasticsearch 成为了不错的选择,在使用过程中遇到了一些问题,也摸索出了解决方案(且在当时没百度到),在此记录下

希望能帮助到遇到同样问题的人

一、批量插入出现异常

PublishSearchRepository 有save和saveall方法 一般少量数据插入是没问题的,但是大批量插入,如数据初始化时, 将会引起异常(这个也与服务器性能相关),当时我就遇到了两种不同的异常,
1 too many connections 
2.too large data

解决方案是采用 bulkIndex 插入  ,此处献上部分代码

  1. @Autowired
  2. private ElasticsearchRestTemplate elasticsearchTemplate;
  3. //部分代码....
  4. //将doc数据转成 IndexQuery
  5. List<IndexQuery> indexQueryList;
  6. indexQueryList = Lists.transform(recordDocList, s -> {
  7. IndexQuery query = new IndexQuery();
  8. query.setObject(s);
  9. return query;
  10. });
  11. //分批次插入 这个量可以更大 视服务器性能而定(带宽/数据量大小/服务器性能)
  12. int last;
  13. int batchSize = 500;
  14. for (int i = 0; i < indexQueryList.size()/batchSize + 1; i++) {
  15. last = Math.min((i + 1) * batchSize, indexQueryList.size());
  16. elasticsearchTemplate.bulkIndex(indexQueryList.subList(i*batchSize, last), IndexCoordinates.of("shipment"));
  17. }

 

 

二、更新使用save 还是update

百度上有篇博客说 

PublishSearchRepository.save(Docment)   docment如果传id执行新增,不传执行更新,实测下来发现,确实实现了更新效果,这个实现方式类似于mysql中 delete + insert

更新是更新了,但是数据只能全量覆盖,不能指定更新的列(Docment中为 field)

查看文档后发现

ElasticsearchRestTemplate存在update方法,尝试使用,发现可以实现更新指定列
  1. //实现全量更新
  2. ShipmentRecordDoc recordDoc = new ShipmentRecordDoc();
  3. UpdateQuery updateQuery = UpdateQuery.builder(recordDoc.getShipmentRecordId())
  4. .withDocument(Document.from(BeanUtil.beanToMap(recordDoc)))
  5. .withParams(BeanUtil.beanToMap(recordDoc))
  6. .build();
  7. //实现部分更新
  8. ShipmentRecordDoc recordDoc = new ShipmentRecordDoc();
  9. UpdateQuery updateQuery = UpdateQuery.builder(recordDoc.getShipmentRecordId())
  10. .withDocument(Document.from(BeanUtil.beanToMap(recordDoc, false, true)))
  11. .withParams(BeanUtil.beanToMap(recordDoc, false, true))
  12. .build();
  13. //发现区别了吗,BeanUtil.beanToMap(recordDoc, false, true),这个是hutool的工具类,第一个false表示是否驼峰转下划线,第二个boolean代表是否忽略null值,withDocument会生成对应更新脚本,只传入相应字段,便可以实现部分更新了

 


总结

~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/68866
推荐阅读
相关标签
  

闽ICP备14008679号