Elasticsearch Sliced Scroll分页检索案例分享
为什么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分页检索案例分享相关推荐
- java es scroll,Elasticsearch Scroll分页检索案例分享
Elasticsearch Scroll分页检索案例分享 1.准备工作 2.定义scroll检索dsl 首先定义一个简单的scroll dsl检索脚本 { ## 这里都是用常量在操作,实际场景中可以参 ...
- Elasticsearch聚合查询案例分享
为什么80%的码农都做不了架构师?>>> Elasticsearch聚合查询案例分享 1.案例介绍 本文包含三个案例: 案例1:统计特定时间范围内每个应用的总访问量.访问成功数 ...
- 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 职位查询案例 一.查询职位索引库中的一条数据 二.将SQL转换为DSL 三.职 ...
- Elasticsearch的Scroll操作
Scroll Version:6.1 英文原文地址:Scroll 当一个搜索请求返回单页结果时,可以使用 scroll API 检索体积大量(甚至全部)结果,这和在传统数据库中使用游标的方式非常相似. ...
- Composite 聚合——Elasticsearch 聚合后分页新实现
1.聚合后分页应用场景 在常规检索的基础上,用户期望返回基于特定字段的聚合结果,且用户期望分页查看检索和聚合结果. 如下图所示:以2020东京奥运会热点新闻亚洲飞人"苏炳添"为例, ...
- ElasticSearch、上架与检索
ElasticSearch.上架与检索 目录 ElasticSearch.上架与检索 一.ELASTIC SEARCH 0.简介 1.安装elastic search 2.初步检索 二.进阶检索 三. ...
- 西交利物浦大学企业协同平台案例分享
西交利物浦大学企业协同平台案例分享 项目背景 西交利物浦大学(XJTLU,简称"西浦")是经中国教育部批准,由西安交通大学和英国利物浦大学合作创立的,具有独立法人资格和鲜明特色的新 ...
- elasticsearch高级搜索功能多维度分享
目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...
- 这篇 ElasticSearch 详细使用教程,内部分享时被老大表扬了
这篇 ElasticSearch 详细使用教程,内部分享时被老大表扬了 一.快速入门 1.查看集群的健康状况 http://localhost:9200/_cat http://localhost:9 ...
- SpringBoot+Mybatis+Elasticsearch 实现模糊分页查询并标记关键字
SpringBoot 整合 Elasticsearch 实现模糊分页查询并标记关键字 一.概述 & 介绍 Elasticsearch 是基于 Lucense 技术的搜索引擎(服务器),将数据进 ...
最新文章
- python中args和kwargs_Python 函数参数*args和**kwargs
- python使用缩进作为语法边界一般建议怎样缩进-python基础自测挑战题,适合刚起步不久的小猿!...
- linux stack
- 600兆的html文件怎么打开,如何打开容量600多兆的文本文件
- 使用Nexus私服代理其他maven仓库(jitpack、jcenter)
- Vissim4.3之API/SDK编程;Vissim编程;
- weblogic开发EJB
- 用python实现整段翻译论文
- 如何删除Word文档中的空白页
- 一切就绪,2019年新型智慧城市峰会将展现怎样的“新益阳”
- 炮轰三国服务器维护,炮轰三国小程序-微信炮轰三国小程序小游戏-游戏宝手游网...
- JAVA 构造方法、无参构造方法、有参构造方法、构造方法重载
- pcs与crmsh命令比较
- 线性代数学习笔记(二十二)——向量间的线性关系(二)
- 论程序员成就之天梯排行榜
- 计世网:人类最迫切需要的10项技术
- spring循环引用异常:in its raw version as part of a circular reference, but has eventually been wrapped
- 波段融合生成全色影像
- 数据可视化工具宝藏简单
- 相机内存卡恢复软件数据恢复方法