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计数减去1
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>; j &lt; max; j++) {<span class="hljs-comment">//启动max个线程,并行处理每个slice任务</span>
<span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> i = j;
Thread sliceThread = <span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> Runnable() {<span class="hljs-comment">//多线程并行执行scroll操作做,每个线程对应一个sclice</span> <span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">()</span> </span>{
Map params = <span class="hljs-keyword">new</span> HashMap();
params.put(<span class="hljs-string">"id"</span>, i);
params.put(<span class="hljs-string">"max"</span>, max);<span class="hljs-comment">//最多6个slice,不能大于share数</span>
params.put(<span class="hljs-string">"size"</span>, <span class="hljs-number">100</span>);<span class="hljs-comment">//每页100条记录</span>
ESDatas&lt;Map&gt; sliceResponse = clientUtil.searchList(<span class="hljs-string">"agentstat-*/_search?scroll=1m"</span>,
<span class="hljs-string">"scrollSliceQuery"</span>, params,Map.class);
List&lt;Map&gt; sliceDatas = sliceResponse.getDatas();
incrementSize( sliceDatas.size());<span class="hljs-comment">//统计实际处理的文档数量</span>
<span class="hljs-keyword">long</span> totalSize = sliceResponse.getTotalSize();
String scrollId = sliceResponse.getScrollId();
<span class="hljs-keyword">if</span> (scrollId != <span class="hljs-keyword">null</span>)
scrollIds.add(scrollId);
System.out.println(<span class="hljs-string">"totalSize:"</span> + totalSize);
System.out.println(<span class="hljs-string">"scrollId:"</span> + scrollId);
<span class="hljs-keyword">if</span> (sliceDatas != <span class="hljs-keyword">null</span> &amp;&amp; sliceDatas.size() &gt;= <span class="hljs-number">100</span>) {<span class="hljs-comment">//每页100条记录,迭代scrollid,遍历scroll分页结果</span>
<span class="hljs-keyword">do</span> {
sliceResponse = clientUtil.searchScroll(<span class="hljs-string">"1m"</span>, scrollId, Map.class);
String sliceScrollId = sliceResponse.getScrollId();
<span class="hljs-keyword">if</span> (sliceScrollId != <span class="hljs-keyword">null</span>)
scrollIds.add(sliceScrollId);
sliceDatas = sliceResponse.getDatas();
<span class="hljs-keyword">if</span> (sliceDatas == <span class="hljs-keyword">null</span> || sliceDatas.size() &lt; <span class="hljs-number">100</span>) {
<span class="hljs-keyword">break</span>;
}
incrementSize( sliceDatas.size());<span class="hljs-comment">//统计实际处理的文档数量</span>
} <span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>);
}
countDownLatch.countDown();<span class="hljs-comment">//slice检索完毕后计数器减1</span>
} });
sliceThread.start();<span class="hljs-comment">//启动线程</span>
}
<span class="hljs-keyword">try</span> {
countDownLatch.await();<span class="hljs-comment">//等待所有的线程执行完毕,计数器变成0</span>
} <span class="hljs-keyword">catch</span> (InterruptedException e) {
e.printStackTrace();
}
<span class="hljs-comment">//打印处理耗时和实际检索到的数据</span>
<span class="hljs-keyword">long</span> endtime = System.currentTimeMillis();
System.out.println(<span class="hljs-string">"耗时:"</span>+(endtime - starttime)+<span class="hljs-string">",realTotalSize:"</span>+realTotalSize);
<span class="hljs-comment">//查询存在es服务器上的scroll上下文信息</span>
String scrolls = clientUtil.executeHttp(<span class="hljs-string">"_nodes/stats/indices/search"</span>, 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


                                    </div>
</div>
posted @
2019-05-05 16:34 
星朝 
阅读(...) 
评论(...) 
编辑 
收藏

Elasticsearch Sliced Scroll分页检索案例分享的更多相关文章

  1. elasticsearch 深入 —— Scroll滚动查询

    Scroll search 请求返回一个单一的结果"页",而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor. 滚动并 ...

  2. kibana和ElasticSearch的信息查询检索

    使用kibana来进行ElasticSearch的信息查询检索 大家经常会听到使用ELK搭建日志管理平台.完成日志聚合检索的功能,那么这个平台到底是个什么概念,怎么搭建,怎么使用呢? ELK包括Ela ...

  3. ArcGIS Add-in插件开发从0到1及实际案例分享

    同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...

  4. 数据分页处理系列之一:Oracle表数据分页检索SQL

      关于Oracle数据分页检索SQL语法,网络上比比皆是,花样繁多,本篇也是笔者本人在网络上搜寻的比较有代表性的语法,绝非本人原创,贴在这里,纯粹是为了让"数据分页专题系列"看起 ...

  5. Office 2010 KMS激活原理和案例分享

    Office 2010 KMS激活原理和案例分享     为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企业客户推出了新的批量激活方式:KMS和MAK.这 ...

  6. Office 2010 KMS激活原理和案例分享 - Your Office Solution Here - Site Home - TechNet Blogs

    [作者:葛伟华.张玉工程师 ,  Office/Project支持团队, 微软亚太区全球技术支持中心 ] 为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企 ...

  7. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  8. 性能调优案例分享:Mysql的cpu过高

    性能调优案例分享:Mysql的cpu过高   问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...

  9. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

随机推荐

  1. Lua 与C/C++ 交互系列:注冊枚举enum到Lua Code中

    在Lua Code中注冊C/C++的枚举很easy,就像注冊全局变量一样.我们使用枚举名称作为命名空间,来避免注冊的枚举发生冲突.注冊的枚举存储在全局环境(线程环境)中. 当在Lua Code中訪问枚 ...

  2. 基于ArcGIS Flex API实现动态标绘(1.0)

    标绘作为一种数据展示形式,在多个行业都有需求. 基于ArcGIS Flex API(3.6)实现标绘API,当前版本号1.0 alpha,支持经常使用几种标绘符号,包含: 圆弧.曲线.圆形.椭圆.弓形 ...

  3. Amazon宣布将MXNet作为AWS的深度学习框架——貌似性能比tf高啊

    Amazon公司的Werner Vogels于上周宣布Amazon深度学习框架将会正式选用MXNet,并且AWS将会通过增加源代码贡献.改进文档以及支持来自其它框架的可视化.开发以及迁移工具,为实现M ...

  4. 【BZOJ 2982】 combination

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2982 [算法] lucas定理 [代码] #include<bits/stdc ...

  5. Node.js:JXcore

    ylbtech-Node.js:JXcore 1.返回顶部 1. Node.js JXcore 打包 Node.js 是一个开放源代码.跨平台的.用于服务器端和网络应用的运行环境. JXcore 是一 ...

  6. VirtualBox里如何正确安装增强工具(图文详解)

    不多说,直接上干货! 找到 复制到

  7. MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度 ...

  8. Unity3d Time

    using UnityEngine; using System.Collections; public class test1 : MonoBehaviour { public float angle ...

  9. html+css布局整理笔记

    基本概念 布局模型 流动模型(Flow) 浮动模型(Float) 层模型(Layer) 流动模型 默认的网页布局模式,流动布局模型有两个比较典型的特征: 第一,块级元素都会在所处的包含元素内自上而下按 ...

  10. hdu1829 A Bug's Life 基础种类并查集

    题目的大意可以理解为:A爱B,B爱C ……给出一系列爱恋的关系,推断有没有同性恋. 思路是把相同性别的归为一个集合(等价类),异性的异性为同性. #include<iostream> #i ...