在Elasticsearch中找一个复制索引的接口真难。现在官方唯一推荐的方法是使用游标获得被复制索引的所有document,然后使用bulkIndex新建立一个索引。
这个接口也很奇怪,第一次search竟然不返回数据。
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.search.SearchHit; import donlian.es.ESUtils; /** * 使用scroll方法实现复制索引 * @author [email protected] */ public class ScrollTest { public static void main(String[] args) { Client esClient = ESUtils.getClient(); SearchResponse searchResponse = esClient.prepareSearch(ESUtils.getIndexName()) //加上这个据说可以提高性能,但第一次却不返回结果 .setSearchType(SearchType.SCAN) //实际返回的数量为5*index的主分片格式 .setSize(5) //这个游标维持多长时间 .setScroll(TimeValue.timeValueMinutes(8)) .execute().actionGet(); //第一次查询,只返回数量和一个scrollId System.out.println(searchResponse.getHits().getTotalHits()); System.out.println(searchResponse.getHits().hits().length); //第一次运行没有结果 for (SearchHit hit : searchResponse.getHits()) { System.out.println(hit.getSourceAsString()); } System.out.println("------------------------------"); //使用上次的scrollId继续访问 searchResponse = esClient.prepareSearchScroll(searchResponse.getScrollId()) .setScroll(TimeValue.timeValueMinutes(8)) .execute().actionGet(); System.out.println(searchResponse.getHits().getTotalHits()); System.out.println(searchResponse.getHits().hits().length); for (SearchHit hit : searchResponse.getHits()) { System.out.println(hit.getSourceAsString()); } } }