直接上代码,在 ElasticSearch 2.4 上测试通过。
public class ElasticSearch2Exporter {
private String sourceIp;
private int sourcePort;
private String sourceIndex;
private String targetIp;
private int targetPort;
private String targetIndex;
private int keepAliveMillis = 60000;
public ElasticSearch2Exporter(String ip, String sourceIndex, String targetIndex) {
this(ip, ElasticSearchConsts.DEFAULT_TRANSPORT_PORT, sourceIndex, ip,
ElasticSearchConsts.DEFAULT_TRANSPORT_PORT, targetIndex);
}
public ElasticSearch2Exporter(String sourceIp, String sourceIndex, String targetIp, String targetIndex) {
this(sourceIp, ElasticSearchConsts.DEFAULT_TRANSPORT_PORT, sourceIndex, targetIp,
ElasticSearchConsts.DEFAULT_TRANSPORT_PORT, targetIndex);
}
public ElasticSearch2Exporter(String sourceIp, int sourcePort, String sourceIndex, String targetIp,
int targetPort, String targetIndex) {
this.sourceIp = sourceIp;
this.sourcePort = sourcePort;
this.sourceIndex = sourceIndex;
this.targetIp = targetIp;
this.targetPort = targetPort;
this.targetIndex = targetIndex;
}
public void execute() {
TransportClient sourceClient = null;
TransportClient targetClient = null;
try {
Settings settings = Settings.settingsBuilder().put("client.transport.sniff", true)
.put("client.transport.ignore_cluster_name", true).build();
sourceClient = TransportClient.builder().settings(settings).build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName(sourceIp), sourcePort));
if (StringUtils.equals(sourceIp, targetIp) && sourcePort == targetPort) {
targetClient = sourceClient;
} else {
targetClient = TransportClient.builder().settings(settings).build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName(targetIp), targetPort));
}
// { match_all : {} }
MatchAllQueryBuilder builder = new MatchAllQueryBuilder();
// 每次返回 1000 条记录
SearchResponse scrollResp = sourceClient.prepareSearch(sourceIndex)
.setScroll(new TimeValue(keepAliveMillis)).setQuery(builder).setSize(1000).execute()
.actionGet();
while (true) {
BulkRequestBuilder bulkRequest = targetClient.prepareBulk();
SearchHit[] hits = scrollResp.getHits().getHits();
if (hits.length > 0) {
for (SearchHit searchHit : hits) {
String targetType = getTargetType(searchHit);
String targetId = getTargetId(searchHit);
Map<String, Object> targetSource = getTargetSource(searchHit);
bulkRequest.add(targetClient.prepareIndex(targetIndex, targetType, targetId)
.setRefresh(false).setSource(targetSource));
}
bulkRequest.execute().actionGet();
}
scrollResp = sourceClient.prepareSearchScroll(scrollResp.getScrollId())
.setScroll(new TimeValue(keepAliveMillis)).execute().actionGet();
if (scrollResp.getHits().getHits().length == 0) {
break;
}
}
} catch (UnknownHostException e) {
throw new SystemException(e);
} finally {
if (targetClient != null) {
targetClient.close();
}
if (sourceClient != null) {
sourceClient.close();
}
}
}
/**
* 取得目标类型。
*
* @param searchHit
* @return
*/
public String getTargetType(SearchHit searchHit) {
return searchHit.getType();
}
/**
* 取得目标ID。允许返回 null。
*
* @param searchHit
* @return
*/
public String getTargetId(SearchHit searchHit) {
return searchHit.getId();
}
/**
* 取得目标的数据。
*
* @param searchHit
* @return
*/
public Map<String, Object> getTargetSource(SearchHit searchHit) {
return searchHit.getSource();
}
}