为什么80%的码农都做不了架构师?>>>   

The best elasticsearch highlevel java rest api-----bboss

Elasticsearch Sliced Scroll分页检索案例分享

我们在文章《Elasticsearch Scroll分页检索案例分享》中介绍了elasticsearch scroll的基本用法,本文介绍Elasticsearch Sliced Scroll分页检索功能。

1.准备工作

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

2.定义Sliced Scroll检索dsl

创建配置文件-在resources目录下定义文件scroll.xml

esmapper/scroll.xml

文件内容包含Sliced Scroll检索dsl语句-scrollSliceQuery

<property name="scrollSliceQuery"><![CDATA[{"slice": {"id": $id,"max": $max},"size":$size,"query": {"term" : {"gc.jvmGcOldCount" : 3}}}]]></property>

3.串行方式执行slice检索

/*** 串行方式执行slice scroll操作*/
@Test
public void testSliceScroll() {ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml");List<String> scrollIds = new ArrayList<>();long starttime = System.currentTimeMillis();//scroll slice分页检索int max = 6;long realTotalSize = 0;for (int i = 0; i < max; i++) {Map params = new HashMap();params.put("id", i);params.put("max", max);//最多6个slice,不能大于share数params.put("size", 100);//每页100条记录ESDatas<Map> sliceResponse = clientUtil.searchList("agentstat-*/_search?scroll=1m","scrollSliceQuery", params,Map.class);List<Map> sliceDatas = sliceResponse.getDatas();realTotalSize = realTotalSize + sliceDatas.size();long totalSize = sliceResponse.getTotalSize();String scrollId = sliceResponse.getScrollId();if (scrollId != null)scrollIds.add(scrollId);System.out.println("totalSize:" + totalSize);System.out.println("scrollId:" + scrollId);if (sliceDatas != null && sliceDatas.size() >= 100) {//每页100条记录,迭代scrollid,遍历scroll分页结果do {sliceResponse = clientUtil.searchScroll("1m", scrollId, Map.class);String sliceScrollId = sliceResponse.getScrollId();if (sliceScrollId != null)scrollIds.add(sliceScrollId);sliceDatas = sliceResponse.getDatas();if (sliceDatas == null || sliceDatas.size() < 100) {break;}realTotalSize = realTotalSize + sliceDatas.size();} while (true);}}//打印处理耗时和实际检索到的数据long endtime = System.currentTimeMillis();System.out.println("耗时:"+(endtime - starttime)+",realTotalSize:"+realTotalSize);//查询存在es服务器上的scroll上下文信息String scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);System.out.println(scrolls);//处理完毕后清除scroll上下文信息if(scrollIds.size() > 0) {scrolls = clientUtil.deleteScrolls(scrollIds);System.out.println(scrolls);}//清理完毕后查看scroll上下文信息scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);System.out.println(scrolls);
}

4.并行方式执行slice检索

//用来存放实际slice检索总记录数
long realTotalSize ;
//辅助方法,用来累计每次scroll获取到的记录数
synchronized void incrementSize(int size){this.realTotalSize = this.realTotalSize + size;
}
/*** 并行方式执行slice scroll操作*/
@Test
public void testParralSliceScroll() {final ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml");final List<String> scrollIds = new ArrayList<>();long starttime = System.currentTimeMillis();//scroll slice分页检索final int max = 6;final CountDownLatch countDownLatch = new CountDownLatch(max);//线程任务完成计数器,每个线程对应一个sclice,每运行完一个slice任务,countDownLatch计数减去1for (int j = 0; j < max; j++) {//启动max个线程,并行处理每个slice任务final int i = j;Thread sliceThread = new Thread(new Runnable() {//多线程并行执行scroll操作做,每个线程对应一个sclice@Overridepublic void run() {Map params = new HashMap();params.put("id", i);params.put("max", max);//最多6个slice,不能大于share数params.put("size", 100);//每页100条记录ESDatas<Map> sliceResponse = clientUtil.searchList("agentstat-*/_search?scroll=1m","scrollSliceQuery", params,Map.class);List<Map> sliceDatas = sliceResponse.getDatas();incrementSize( sliceDatas.size());//统计实际处理的文档数量long totalSize = sliceResponse.getTotalSize();String scrollId = sliceResponse.getScrollId();if (scrollId != null)scrollIds.add(scrollId);System.out.println("totalSize:" + totalSize);System.out.println("scrollId:" + scrollId);if (sliceDatas != null && sliceDatas.size() >= 100) {//每页100条记录,迭代scrollid,遍历scroll分页结果do {sliceResponse = clientUtil.searchScroll("1m", scrollId, Map.class);String sliceScrollId = sliceResponse.getScrollId();if (sliceScrollId != null)scrollIds.add(sliceScrollId);sliceDatas = sliceResponse.getDatas();if (sliceDatas == null || sliceDatas.size() < 100) {break;}incrementSize( sliceDatas.size());//统计实际处理的文档数量} while (true);}countDownLatch.countDown();//slice检索完毕后计数器减1}});sliceThread.start();//启动线程}try {countDownLatch.await();//等待所有的线程执行完毕,计数器变成0} catch (InterruptedException e) {e.printStackTrace();}//打印处理耗时和实际检索到的数据long endtime = System.currentTimeMillis();System.out.println("耗时:"+(endtime - starttime)+",realTotalSize:"+realTotalSize);//查询存在es服务器上的scroll上下文信息String scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);
//      System.out.println(scrolls);//处理完毕后清除scroll上下文信息if(scrollIds.size() > 0) {scrolls = clientUtil.deleteScrolls(scrollIds);
//          System.out.println(scrolls);}//清理完毕后查看scroll上下文信息scrolls = clientUtil.executeHttp("_nodes/stats/indices/search", ClientUtil.HTTP_GET);
//      System.out.println(scrolls);
}

通过串行运行和并行运行结果比较,并行处理的性能要好很多,实际检索到的文档数量等价一致。

5.参考文档

https://www.elastic.co/guide/en/elasticsearch/reference/6.2/search-request-scroll.html

6.开发交流

elasticsearch技术交流群:166471282

elasticsearch微信公众号:

转载于:https://my.oschina.net/bboss/blog/1788729

Elasticsearch Sliced Scroll分页检索案例分享相关推荐

  1. java es scroll,Elasticsearch Scroll分页检索案例分享

    Elasticsearch Scroll分页检索案例分享 1.准备工作 2.定义scroll检索dsl 首先定义一个简单的scroll dsl检索脚本 { ## 这里都是用常量在操作,实际场景中可以参 ...

  2. Elasticsearch聚合查询案例分享

    为什么80%的码农都做不了架构师?>>>    Elasticsearch聚合查询案例分享 1.案例介绍 本文包含三个案例: 案例1:统计特定时间范围内每个应用的总访问量.访问成功数 ...

  3. 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 职位查询案例 一.查询职位索引库中的一条数据 二.将SQL转换为DSL 三.职 ...

  4. Elasticsearch的Scroll操作

    Scroll Version:6.1 英文原文地址:Scroll 当一个搜索请求返回单页结果时,可以使用 scroll API 检索体积大量(甚至全部)结果,这和在传统数据库中使用游标的方式非常相似. ...

  5. Composite 聚合——Elasticsearch 聚合后分页新实现

    1.聚合后分页应用场景 在常规检索的基础上,用户期望返回基于特定字段的聚合结果,且用户期望分页查看检索和聚合结果. 如下图所示:以2020东京奥运会热点新闻亚洲飞人"苏炳添"为例, ...

  6. ElasticSearch、上架与检索

    ElasticSearch.上架与检索 目录 ElasticSearch.上架与检索 一.ELASTIC SEARCH 0.简介 1.安装elastic search 2.初步检索 二.进阶检索 三. ...

  7. 西交利物浦大学企业协同平台案例分享

    西交利物浦大学企业协同平台案例分享 项目背景 西交利物浦大学(XJTLU,简称"西浦")是经中国教育部批准,由西安交通大学和英国利物浦大学合作创立的,具有独立法人资格和鲜明特色的新 ...

  8. elasticsearch高级搜索功能多维度分享

    目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...

  9. 这篇 ElasticSearch 详细使用教程,内部分享时被老大表扬了

    这篇 ElasticSearch 详细使用教程,内部分享时被老大表扬了 一.快速入门 1.查看集群的健康状况 http://localhost:9200/_cat http://localhost:9 ...

  10. SpringBoot+Mybatis+Elasticsearch 实现模糊分页查询并标记关键字

    SpringBoot 整合 Elasticsearch 实现模糊分页查询并标记关键字 一.概述 & 介绍 Elasticsearch 是基于 Lucense 技术的搜索引擎(服务器),将数据进 ...

最新文章

  1. python中args和kwargs_Python 函数参数*args和**kwargs
  2. python使用缩进作为语法边界一般建议怎样缩进-python基础自测挑战题,适合刚起步不久的小猿!...
  3. linux stack
  4. 600兆的html文件怎么打开,如何打开容量600多兆的文本文件
  5. 使用Nexus私服代理其他maven仓库(jitpack、jcenter)
  6. Vissim4.3之API/SDK编程;Vissim编程;
  7. weblogic开发EJB
  8. 用python实现整段翻译论文
  9. 如何删除Word文档中的空白页
  10. 一切就绪,2019年新型智慧城市峰会将展现怎样的“新益阳”
  11. 炮轰三国服务器维护,炮轰三国小程序-微信炮轰三国小程序小游戏-游戏宝手游网...
  12. JAVA 构造方法、无参构造方法、有参构造方法、构造方法重载
  13. pcs与crmsh命令比较
  14. 线性代数学习笔记(二十二)——向量间的线性关系(二)
  15. 论程序员成就之天梯排行榜
  16. 计世网:人类最迫切需要的10项技术
  17. spring循环引用异常:in its raw version as part of a circular reference, but has eventually been wrapped
  18. 波段融合生成全色影像
  19. 数据可视化工具宝藏简单
  20. 相机内存卡恢复软件数据恢复方法

热门文章

  1. Python将.nii格式文件转换为.png格式
  2. jabref java_Jabref安装及使用教程
  3. js prototype原形
  4. 主流的移动机器人视觉系统,主要分为哪几种?
  5. 小米路由器显示网络未连接到服务器,小米路由器不能上网(连不上网)解决方法...
  6. 【译】Rust 中的错误处理
  7. SAT数学:必背公式之三角函数
  8. 采购证书有了解过吗?
  9. Java 发送消息模版内容换行(包含微信,企业微信)
  10. 云计算 三种模式 各种云的区别