【问题标题】: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 对象)获取的索引名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 2015-08-07
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多