当我们在构造条件进行查询时,如果符合你的构造条件的数据量非常庞大,你就会发现response.getHits().getTotalHits()
的值只是10000。那么如何解决这个问题?这时就可以使用elasticsearch中的scroll(滚动查询)
。
什么是滚动查询 ?
滚动查询和原生查询,一个相当于我们翻书,可以跳,一个相当于长图,看到哪儿显示哪儿,这也是他们的异同点:滚动查询无论查多少数据都可以,但是不能翻页,不支持分页,普通查询,支持翻页分页,但是只支持一万笔以内的数据量
如果直接使用 Java Client,可以参考官方 API 文档:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-search-scroll.html
滚动查询使用
直接上代码:
@SpringBootTest
@Slf4j
class SpringbootElasticsearchApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
final Scroll scroll = new Scroll(TimeValue.timeValueMillis(100L)); //设置滚动查询时间
//构建查询请求
SearchRequest searchRequest = new SearchRequest().indices("t_shirt");
@Test
public void scrollTest1() throws IOException {
searchRequest.scroll(scroll);
BoolQueryBuilder must = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("color", "red"));
searchRequest.source(new SearchSourceBuilder().query(must).size(2));
//第一次查询结果 (前10000条数据)
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("首次查询数量====》"+ searchResponse.getHits().getHits().length);
//获取滚动查询id
String scrollId = searchResponse.getScrollId();
//查询结果
SearchHit[] hits = searchResponse.getHits().getHits();
//进行滚动查询
while (hits != null && hits.length > 0){
//创建滚动查询请求
SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
//每次滚动查询时间
searchScrollRequest.scroll(scroll);
//执行滚动查询,更新响应结果
searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
//更新scrollId
scrollId = searchResponse.getScrollId();
//处理返回搜索结果
hits = searchResponse.getHits().getHits();
System.out.println("滚动查询数量====》"+hits.length);
//TODO 结果处理
}
//完成滚动查询后清除滚动上下文
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();
System.out.println("是否清除=====》"+succeeded);
}
}
注意:
- searchRequest.source(new SearchSourceBuilder().query(must).size(2)); 设置每次滚动查询的数量
- 可以看出来,滚动查询也很简单,普通查询只能查一万笔,滚动查询就是从第一万零一笔数据开始,进行滚动,后续一直滚动,直到没有,所以滚动查询出来的结果逻辑处理,和上边普通查询是一样的,另外,滚动查询是建立在普通查询基础上的!!!
以上就是ES的滚动查询,可以解决普通查询只能查询一万笔的限制。