import org.elasticsearch.action.search.*;
import org.elasticsearch.client.*;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import java.util.ArrayList;
import java.util.List;
public class ScrollQueryExample {
public static void main( String[ ] args) throws Exception {
// 创建 Elasticsearch 客户端
RestClient restClient = RestClient.builder( new HttpHost( "localhost" , 9200 )) .build( ) ;
// 创建一个初始搜索请求
SearchRequest searchRequest = new SearchRequest( "your_index_name" ) ;
searchRequest.scroll( TimeValue.timeValueMinutes( 1 )) ; // 设置滚动的保持时间
// 设置搜索查询条件,可以根据您的需求进行更改
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder( ) ;
searchSourceBuilder.query( QueryBuilders.matchAllQuery( )) ; // 匹配所有文档
searchRequest.source( searchSourceBuilder) ;
// 执行初始搜索请求
SearchResponse searchResponse = restClient.search( searchRequest, RequestOptions.DEFAULT) ;
// 存储滚动标识符
String scrollId = searchResponse.getScrollId( ) ;
List< Map< String, Object>> documentList = new ArrayList<> ( ) ;
while ( true) {
// 遍历滚动结果
for ( SearchHit hit : searchResponse.getHits( ) .getHits( )) {
documentList.add( hit.getSourceAsMap( )) ;
}
// 创建一个新的滚动请求
SearchScrollRequest scrollRequest = new SearchScrollRequest( scrollId) ;
scrollRequest.scroll( TimeValue.timeValueMinutes( 1 )) ; // 设置滚动的保持时间
// 执行滚动请求
searchResponse = restClient.scroll( scrollRequest, RequestOptions.DEFAULT) ;
// 检查是否有更多的文档需要滚动
if ( searchResponse.getHits( ) .getHits( ) .length == 0 ) {
break ;
}
}
// 清除滚动上下文
ClearScrollRequest clearScrollRequest = new ClearScrollRequest( ) ;
clearScrollRequest.addScrollId( scrollId) ;
ClearScrollResponse clearScrollResponse = restClient.clearScroll( clearScrollRequest, RequestOptions.DEFAULT) ;
// 关闭 Elasticsearch 客户端
restClient.close( ) ;
// 现在,documentList 包含了所有文档的数据
for ( Map< String, Object> document : documentList) {
System.out.println( document) ;
}
}
}
POST /your_index_name/_search?scroll= 1m
{
"size" : 100 ,
"query" : {
"match_all" : { }
}
}
POST /_search/scroll
{
"scroll" : "1m" ,
"_scroll_id" : "your_previous_scroll_id"
}