Elasticsearch Scroll分页检索案例分享

bboss

Elasticsearch Scroll分页检索案例分享

1.准备工作

参考文档《高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端bboss

2.定义scroll检索dsl

首先定义一个简单的scroll dsl检索脚本

  1. <properties>
  2. <property name="scrollQuery">
  3. <![CDATA[
  4. {
  5. ## 这里都是用常量在操作,实际场景中可以参数化变量
  6. "size":1000,
  7. "query": {
  8. "term" : {
  9. "gc.jvmGcOldCount" : 3 ##参数值可以定义为变量,通过参数传递进来
  10. }
  11. }
  12. }
  13. ]]>
  14. </property>
  15. </properties>

3.Scroll检索代码

  1. @Test
  2. public void testScroll(){
  3. ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml");
  4. //scroll分页检索,将检索结果映射为Map对象,也可以映射为自定义的实体对象
  5. ESDatas<Map> response = clientUtil.searchList("agentstat-*/_search?scroll=1m",
  6. "scrollQuery",//对于dsl脚本名称,在esmapper/scroll.xml文件中配置
  7. Map.class);
  8. List<Map> datas = response.getDatas();//第一页数据
  9. List<String > scrollIds = new ArrayList<>();//用于记录每次scroll的scrollid,便于检索完毕后清除
  10. long totalSize = response.getTotalSize();//总记录数
  11. String scrollId = response.getScrollId();//第一次的scrollid
  12. if(scrollId != null)
  13. scrollIds.add(scrollId);
  14. System.out.println("totalSize:"+totalSize);
  15. System.out.println("scrollId:"+scrollId);
  16. if(datas != null && datas.size() > 0) {//每页1000条记录,通过迭代scrollid,遍历scroll分页结果
  17. do {
  18. response = clientUtil.searchScroll("1m",scrollId,Map.class);
  19. scrollId = response.getScrollId();//每页的scrollid
  20. if(scrollId != null)
  21. scrollIds.add(scrollId);
  22. datas = response.getDatas();//每页的纪录数
  23. if(datas == null || datas.size() == 0){
  24. break;
  25. }
  26. } while (true);
  27. }
  28. //查询并打印存在于es服务器上的scroll上下文信息
  29. String scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);
  30. System.out.println(scrolls);
  31. //清除scroll上下文信息,虽然说超过1分钟后,scrollid会自动失效,
  32. //但是手动删除不用的scrollid,是一个好习惯
  33. if(scrollIds.size() > 0) {
  34. scrolls = clientUtil.deleteScrolls(scrollIds);
  35. System.out.println(scrolls);
  36. }
  37. //清理完毕后查看scroll上下文信息
  38. scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);
  39. System.out.println(scrolls);
  40. }

4.Scroll案例项目地址和代码文件

项目地址:

https://gitee.com/bboss/elasticsearchdemo/

scroll检索对应的代码和脚本文件:

https://gitee.com/bboss/elasticsearchdemo/blob/master/src/test/resources/esmapper/scroll.xml

https://gitee.com/bboss/elasticsearchdemo/blob/master/src/test/java/org/frameworkset/elasticsearch/TestScrollQuery.java