elasticsearch使用RestHighLevelClient API重建index

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();
}
}

代码比较简单,基本按照套路来就可以。本例只用了单线程方法实现,未用多线程方式实现。 如果有什么问题,还请提出。

转载于:https://my.oschina.net/snowpipe/blog/3055669

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值