@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个小时左右就完成。