当前位置:   article > 正文

最新elasticsearch7(二、批量插入存在即更新java)_es存在即更新

es存在即更新

前言

本篇开发环境基于上篇,客户端client使用rest风格的高等级(high level)API,这节我们来讲下ES的批量插入或更新操作。

唯一键

这里先提个概念,存在则更新。ES是以_id来作为doc的唯一键的,等同于主键,但它没有像关系型数据库的索引,不过我们开始可以利用_id来实现我们唯一索引的目的。当有多个字段需作为唯一键时,我们可以利用hash的方式生成一个唯一id,es支持自定义id值,这样就可以实现唯一索引了。

批量插入

批量操作需要使用bulk api。代码中的IndexRequest允许两张操作类型DocWriteRequest.OpType.CREATE(新增操作)和DocWriteRequest.OpType.INDEX(存在则替换)

    @Autowired
    private RestHighLevelClient highLevelClient;
    
	public void bulkTest() throws IOException {
        BulkRequest request = new BulkRequest(); 
        request.add(new IndexRequest("posts").id("1")  
                .source(XContentType.JSON,"field", "foo"));
        request.add(new IndexRequest("posts").id("2")  
                .source(XContentType.JSON,"field", "bar").opType(DocWriteRequest.OpType.CREATE));
        highLevelClient.bulk(request, RequestOptions.DEFAULT);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

批量插入或更新

由于IndexRequest不能实现我们的需求,所以存在则修改操作还需要借助UpdateRequest来实现。但是普通UpdateRequest请求只能修改存在的doc,所以还需要寻找其他方法,我们在文档中找到upsets,该方法的描述是:

If the document does not already exist, it is possible to define some
content that will be inserted as a new document using the upsert
method

所以我们可以利用这个方法来实现插入批量插入或更新。数据量较大时可以使用bulkAsync异步插入,这里演示使用同步方式。

    public void bulkUpdate() throws IOException {
        BulkRequest request = new BulkRequest();
        request.add(new UpdateRequest("sign1","1").doc(XContentType.JSON, "name", "tom").upsert());
        request.add(new UpdateRequest("sign1","1").doc(XContentType.JSON, "name", "bob", "age", 10).upsert());
        highLevelClient.bulk(request, RequestOptions.DEFAULT);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行后可以看到_id为1的文档,name被替换了,age也添加了
在这里插入图片描述

结尾

下节我们来看下最新的Elasticsearch7如果利用jdbc实现sql方式查询,网上的很多用例版本都比较久,测试起来bug也较多。

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

闽ICP备14008679号