elasticsearch 7及6的部分版本建议使用 RestHighLevelClient替代原来的Transport Client API 以下是使用rest高阶api实现index重建的过程,主要思路是使用scroll api读取原index中的数据,然后使用BulkProcessor将数据写入到新Index中。 es版本为6.7
public class TestBulkProcessor {
private static RestHighLevelClient client;
private static BulkProcessor bulkProcessor;
static{
client = new RestHighLevelClient(
RestClient.builder(new HttpHost("192.168.1.6", 32778, "http")).setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(6000).setSocketTimeout(10000)));
}
public static void main(String[] args) throws IOException {
BulkProcessor.Listener listener = new BulkProcessor.Listener() {
[@Override](https://my.oschina.net/u/1162528)
public void beforeBulk(long executionId, BulkRequest request) {
}
[@Override](https://my.oschina.net/u/1162528)
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
}
[@Override](https://my.oschina.net/u/1162528)
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
}
};
bulkProcessor = BulkProcessor
.builder((request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
listener)
.setBulkActions(500)
// .setBulkSize(new ByteSizeValue(1L, ByteSizeUnit.MB)) //6.7版本不能识别该属性
.setConcurrentRequests(0).setFlushInterval(TimeValue.timeValueSeconds(3L))
.setBackoffPolicy(BackoffPolicy.constantBackoff(TimeValue.timeValueSeconds(1L), 3))
.build();
final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
SearchRequest request = new SearchRequest("oldIndex");
request.scroll(scroll);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.queryStringQuery("*.*"));
searchSourceBuilder.size(100);
request.source(searchSourceBuilder);
// 开始查询,返回 SearchResponse对象
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
String scrollId = response.getScrollId();
SearchHit[] searchHits = response.getHits().getHits();
//循环获取scroll id
while (searchHits != null && searchHits.length > 0) {
for (SearchHit hit : searchHits) {
IndexRequest indexRequest = new IndexRequest("newIndex", hit.getType(), hit.getId())
.source(hit.getSourceRef(), XContentType.JSON);
bulkProcessor.add(indexRequest);
}
SearchScrollRequest sRequest = new SearchScrollRequest(scrollId);
sRequest.scroll(scroll);
response = client.scroll(sRequest, RequestOptions.DEFAULT);
scrollId = response.getScrollId();
searchHits = response.getHits().getHits();
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();
bulkProcessor.flush();
client.close();
}
}
代码比较简单,基本按照套路来就可以。本例只用了单线程方法实现,未用多线程方式实现。 如果有什么问题,还请提出。