【问题标题】:Spring Elasticsearch - bulk save multiple indices in one line?Spring Elasticsearch - 在一行中批量保存多个索引?
【发布时间】:2022-11-16 03:58:52
【问题描述】:
我有多个具有不同索引名称的文档,这些文档批量保存在 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);
}
但是,这是否仍然可以通过仅调用一行来优化,保存多个不同索引类型的列表?
【问题讨论】:
标签:
java
elasticsearch
spring-data-elasticsearch
【解决方案1】:
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"));
【解决方案2】:
对于 Spring Data Elasticsearch:
ElasticsearchOperations.bulkXXX() 方法将 List<IndexQuery> 作为第一个参数。您可以为这些对象中的每一个设置一个索引名称,以指定应该在哪个索引中写入/更新数据。如果在 IndexQuery 中没有设置索引名称,则使用从最后一个参数(实体类或 IndexCoordinates 对象)获取的索引名称。