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

文章目录

    • 前言
    • 唯一键
    • 批量插入
    • 批量插入或更新
    • 结尾

前言

本篇开发环境基于上篇,客户端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);
    }

批量插入或更新

由于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);
    }

执行后可以看到_id为1的文档,name被替换了,age也添加了
最新elasticsearch7(二、批量插入存在即更新java)_第1张图片

结尾

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

你可能感兴趣的:(大数据,Elasticsearch,elasticsearch,大数据,java,批量插入,bulk)