也是查看很多资料,又被版本给坑了。切记 版本版本
下面 基于 2.3.3 实现
package com.es.scroll;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequestBuilder;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.search.SearchHit;
public class ScrollDemo {
/**
* 获取 客户端对象
*
* @return
* @throws UnknownHostException
*/
private static Client getClient() throws UnknownHostException {
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
public static void main(String[] args) throws UnknownHostException {
// TODO Auto-generated method stub
Client client = getClient();
// search(client);
// String scorll_id = searchByScroll(client);
// searchByScrollId(client, scorll_id);
getScorllId(client);
// getData(client,getScorllId(client));
// searchScroll23(client);
}
/**
* 一般搜索 分页基于 form size 实现 size 超过 1 万数据 就会 抛出异常 最好限制在 10000 之内
*
* @param client
*/
public static void search(Client client) {
// String index = "domainindex";
String type = "domain_v11";
// 搜索条件
SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
// searchRequestBuilder.setIndices(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setSize(50);
// searchRequestBuilder.setIndices(indices) // 加入 这句 报错 index not found
// 原因 位置等待解决
// 执行
SearchResponse searchResponse = searchRequestBuilder.get();
// 搜索结果
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
System.out.println("--------- searchByScroll source {}" + source);
} // for
}
/**
* 获取 scrollId 基于 2.3.3 版本
* @param client
* @return
*/
public static void getScorllId(Client client) {
String query = "{\"query\": {\"match\": {\"host\": \"bmw\"}}}";
SearchResponse responseSearch = client.prepareSearch("domain_v11")
.setScroll("1m")
// .setQuery(query)
.setSize(10)
.setSearchType(SearchType.SCAN)
.execute().actionGet();
int count = (int) responseSearch.getHits().getTotalHits();//第一次不返回数据
for(int i=0,sum=0; sum<count; i++){
System.out.println(responseSearch.getScrollId());
responseSearch = client.prepareSearchScroll(responseSearch.getScrollId())
.setScroll(TimeValue.timeValueMinutes(8))
.execute().actionGet();
sum += responseSearch.getHits().hits().length;
System.out.println("总量"+count+" 已经查到"+sum);
SearchHit[] hits = responseSearch.getHits().hits();
for (SearchHit searchHit : hits) {
System.out.println(searchHit.getSource().get("id"));
}
}
// String scrollId = responseSearch.getScrollId();
// return scrollId;
}
/**
* 基于 2.3.3 版本
* 获取 数据
* @param client
* @param scrollId
*/
public static void getData(Client client,String scrollId) {
System.out.println("scrollId:"+scrollId);
SearchResponse response = client.prepareSearchScroll(scrollId)
.execute().actionGet();
SearchHit[] hits = response.getHits().getHits();
if(hits.length==0)
{
System.out.println("no data");
}
for (SearchHit searchHit : hits) {
System.out.println(searchHit.getSource().get("id")+" "+searchHit.getSource().get("cname"));
}
}
public static void searchScroll23(Client client) {
SearchResponse responseSearch = client.prepareSearch("domain_v11").setScroll("1m").setSearchType(SearchType.SCAN)
.execute().actionGet();
String scrollId = responseSearch.getScrollId();
SearchResponse response = client.prepareSearchScroll(scrollId).execute().actionGet();
SearchHit[] hits = response.getHits().getHits();
if(hits.length==0)
{
System.out.println("no data");
}
for (SearchHit searchHit : hits) {
System.out.println(searchHit.getSource());
}
}
/**
* 根据 scroll 搜索 提高 搜索 结果 速度 测试
*
* @param client
*/
public static String searchByScroll(Client client) {
String index = "domainindex";
String type = "domain_v11";
// 搜索条件
SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
// searchRequestBuilder.setIndices(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setSize(20);
searchRequestBuilder.setScroll(new TimeValue(30000));
searchRequestBuilder.setSearchType(SearchType.SCAN);
// 执行
SearchResponse searchResponse = searchRequestBuilder.get();
String scrollId = searchResponse.getScrollId();
System.out.println(scrollId);
SearchHit[] searchHits = searchResponse.getHits().getHits();
System.out.println("searchHits:" + searchHits.length);
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
System.out.println(source);
} // for
return scrollId;
}
/**
* 根据 scroll_id 获取 数据
*
* @param client
* @param scrollId
*/
public static void searchByScrollId(Client client, String scrollId) {
TimeValue timeValue = new TimeValue(30000);
SearchScrollRequestBuilder searchScrollRequestBuilder;
SearchResponse response;
// 结果
while (true) {
searchScrollRequestBuilder = client.prepareSearchScroll(scrollId);
// 重新设定滚动时间
searchScrollRequestBuilder.setScroll(timeValue);
// 请求
response = searchScrollRequestBuilder.get();
// 每次返回下一个批次结果 直到没有结果返回时停止 即hits数组空时
if (response.getHits().getHits().length == 0) {
break;
} // if
// 这一批次结果
SearchHit[] searchHits = response.getHits().getHits();
for (SearchHit searchHit : searchHits) {
String source = searchHit.getSource().toString();
System.out.println(source);
} // for
// 只有最近的滚动ID才能被使用
scrollId = response.getScrollId();
} // while
}
}