es scroll 代替 form size 实现 分页 java 版本

也是查看很多资料,又被版本给坑了。切记 版本版本 

下面 基于 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
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值