ES7 完成reindex 数据复制

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TalentApplication.class})
public class ReindexData {

    @Resource
    private EsConfig esConfig;

    @Test
    public void testReindex() throws IOException, InterruptedException {
        RestHighLevelClient client = esConfig.restHighLevelClient();

        String sourceIndex = "源索引";
        String destIndex = "目标索引";

        reindex(client, sourceIndex, destIndex);
    }

    private void reindex(RestHighLevelClient client, String sourceIndex, String destIndex) throws IOException {
        SearchRequest searchRequest = new SearchRequest(sourceIndex);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchSourceBuilder.size(1000);
        searchRequest.source(searchSourceBuilder);
        searchRequest.scroll(TimeValue.timeValueMinutes(20));

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        String scrollId = searchResponse.getScrollId();
        SearchHit[] searchHits = searchResponse.getHits().getHits();

        BulkProcessor bulkProcessor = BulkProcessor.builder(
                (request, bulkListener) ->
                        client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
                new BulkProcessor.Listener() {
                    @Override
                    public void beforeBulk(long executionId, BulkRequest request) {
                        System.out.println("Executing bulk request with " + request.numberOfActions() + " actions");
                    }

                    @Override
                    public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
                        if (response.hasFailures()) {
                            System.out.println("Bulk request completed with failures: " + response.buildFailureMessage());
                        } else {
                            System.out.println("Bulk request completed successfully");
                        }
                    }

                    @Override
                    public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
                        System.out.println("Bulk request failed: " + failure.getMessage());
                    }
                }).build();

        try {
            while (searchHits != null && searchHits.length > 0) {
                for (SearchHit hit : searchHits) {
                    IndexRequest indexRequest = new IndexRequest(destIndex)
                            .id(hit.getId())
                            .source(hit.getSourceAsMap());
                    bulkProcessor.add(indexRequest);
                }

                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId)
                        .scroll(TimeValue.timeValueMinutes(5));
                searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
                scrollId = searchResponse.getScrollId();
                searchHits = searchResponse.getHits().getHits();
            }
        } finally {
            bulkProcessor.close();
        }
    }
}

POST _reindex?timeout=560m
{

  "conflicts": "proceed",
  "source": {
    "index": "源索引"
  },
  "dest": {
    "index": "目标索引"
  }
}
 

上面代码中,31w的数据量,花费大约2个小时左右就完成。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值