es 利用scroll高效分页查询10万条数据 Java demo
时间: 2024-02-24 12:59:15 浏览: 30
使用 Elasticsearch 的 Scroll API 可以实现高效分页查询大量数据。下面是一个基于 Java 的 demo:
```java
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.ClearScrollResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
public class ElasticsearchDemo {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
sourceBuilder.size(10000);
sourceBuilder.timeout(new TimeValue(60, TimeValue.Unit.SECONDS));
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("your_index_name");
searchRequest.scroll(new TimeValue(60000));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
String scrollId = searchResponse.getScrollId();
SearchHit[] hits = searchResponse.getHits().getHits();
while (hits != null && hits.length > 0) {
// 处理查询结果
for (SearchHit hit : hits) {
// 处理查询结果
}
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(new TimeValue(60000));
searchResponse = client.scroll(scrollRequest);
scrollId = searchResponse.getScrollId();
hits = searchResponse.getHits().getHits();
}
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest);
client.close();
}
}
```
上述代码中,我们通过 Elasticsearch 的 Java 客户端 RestHighLevelClient 发起查询请求,并设置查询条件为 `matchAllQuery()`,查询结果的数量为 10000,查询超时时间为 60 秒。然后使用 `searchRequest.scroll(new TimeValue(60000))` 设置查询结果的滚动时间为 60 秒,获取第一次查询结果 `searchResponse`。
接下来,我们使用 `searchResponse.getScrollId()` 获取查询结果的 scrollId,并使用 `searchResponse.getHits().getHits()` 获取查询结果的 hits 数组,处理查询结果。然后使用 `SearchScrollRequest` 发起下一次查询,获取查询结果 `searchResponse` 和新的 scrollId,重复以上操作,直到查询结果为空。
最后,我们使用 `ClearScrollRequest` 清除 scrollId,释放资源。
使用 Scroll API 可以高效地查询大量数据,但需要注意的是,查询结果会占用 Elasticsearch 的内存资源,需要在使用完毕后及时清除 scrollId。