Spring Elasticsearch -在一行中批量保存多个索引?

bwntbbo3  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(2)|浏览(150)

我有多个具有不同索引名称的文档,这些文档批量保存在ElasticSearch中:

public void bulkCreateOrUpdate(List personUpdateList, List addressUpdateList, List positionUpdateList) {
    this.operations.bulkUpdate(personUpdateList,Person.class);
    this.operations.bulkUpdate(addressUpdateList, Address.class);
    this.operations.bulkUpdate(positionUpdateList, Position.class);
}

但是,通过只调用一行代码,保存不同索引类型的多个列表,是否仍然可以优化这一点?

uqdfh47h

uqdfh47h1#

Tldr;

bulk api当然可以。
这是一个有效呼叫

POST _bulk
{"index":{"_index":"index_1"}}
{"data":"data"}
{"index":{"_index":"index_2"}}
{"data":"data"}

您的Java客户端如何处理它...我不确定。

溶液

这可以通过以下方式实现:

BulkRequest.Builder br = new BulkRequest.Builder();

br.operations(op -> op           
        .index(idx -> idx            
            .index("index_1")       
            .id("1")
            .document(document)
        )
    );

br.operations(op -> op           
        .index(idx -> idx            
            .index("index_2")       
            .id("1")
            .document(document)
        )
    );

这可以通过以下方式实现:

BulkRequest request = new BulkRequest(); 

request.add(new IndexRequest("index_1").id("1")  
        .source(XContentType.JSON,"data", "data"));
request.add(new IndexRequest("index_2").id("1")  
        .source(XContentType.JSON,"data", "data"));
eiee3dmh

eiee3dmh2#

对于Spring Data ElasticSearch:
ElasticsearchOperations.bulkXXX()方法将List<IndexQuery>作为第一个参数。您可以在每个对象上设置一个索引名称,以指定应在哪个索引中写入/更新数据。如果IndexQuery中未设置索引名称,则使用从最后一个参数(实体类或IndexCoordinates对象)获取的索引名称。

相关问题