网站首页 > 技术文章 正文
本文内容
- 基本scroll api使用
- 基本scroll api与自定义scorll结果集handler函数结合使用
- slice api使用(并行/串行)
- slice api使用与自定义scorll结果集handler函数结合使用(并行/串行)
本文对应的maven源码工程:
https://gitee.com/bbossgroups/eshelloword-booter
1.dsl配置文件定义
首先定义本文需要的dsl配置文件
esmapper/scroll.xml
<properties> <!-- 简单的scroll query案例,复杂的条件修改query dsl即可 --> <property name="scrollQuery"> <![CDATA[ { "size":#[size], "query": {"match_all": {}} } ]]> </property> <!-- 简单的slice scroll query案例,复杂的条件修改query dsl即可 --> <property name="scrollSliceQuery"> <![CDATA[ { "slice": { "id": #[sliceId], ## 必须使用sliceId作为变量名称 "max": #[sliceMax] ## 必须使用sliceMax作为变量名称 }, "size":#[size], "query": {"match_all": {}} } ]]> </property> </properties>
下面介绍scroll各种用法,对应的测试类文件为:TestScrollAPIQuery
2.基本scroll api使用
@Test public void testSimleScrollAPI(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll分页检索 Map params = new HashMap(); params.put("size", 10000);//每页10000条记录 //scroll上下文有效期1分钟,每次scroll检索的结果都会合并到总得结果集中;数据量大时存在oom内存溢出风险,大数据量时可以采用handler函数来处理每次scroll检索的结果(后面介绍) ESDatas<Map> response = clientUtil.scroll("demo/_search","scrollQuery","1m",params,Map.class); List<Map> datas = response.getDatas(); long realTotalSize = datas.size(); long totalSize = response.getTotalSize(); System.out.println("totalSize:"+totalSize); System.out.println("realTotalSize:"+realTotalSize); System.out.println("countAll:"+clientUtil.countAll("demo")); }
3.基本scroll api与自定义scorll结果集handler函数结合使用
@Test public void testSimleScrollAPIHandler(){ ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll分页检索 Map params = new HashMap(); params.put("size", 5000);//每页5000条记录 //采用自定义handler函数处理每个scroll的结果集后,response中只会包含总记录数,不会包含记录集合 //scroll上下文有效期1分钟;大数据量时可以采用handler函数来处理每次scroll检索的结果,规避数据量大时存在的oom内存溢出风险 ESDatas<Map> response = clientUtil.scroll("demo/_search", "scrollQuery", "1m", params, Map.class, new ScrollHandler<Map>() { public void handle(ESDatas<Map> response) throws Exception {//自己处理每次scroll的结果 List<Map> datas = response.getDatas(); long totalSize = response.getTotalSize(); System.out.println("totalSize:"+totalSize+",datas.size:"+datas.size()); } }); System.out.println("response realzie:"+response.getTotalSize()); }
4.slice api使用
串行
/** * 串行方式执行slice scroll操作 */ @Test public void testSimpleSliceScrollApi() { ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll slice分页检索,max对应并行度,一般设置为与索引表的shards数一致 int max = 6; Map params = new HashMap(); params.put("sliceMax", max);//建议不要大于索引表的shards数 params.put("size", 100);//每页100条记录 //scroll上下文有效期1分钟,每次scroll检索的结果都会合并到总得结果集中;数据量大时存在oom内存溢出风险,大数据量时可以采用handler函数来处理每次slice scroll检索的结果(后面介绍) ESDatas<Map> sliceResponse = clientUtil.scrollSlice("demo/_search", "scrollSliceQuery", params,"1m",Map.class, false);//false表示串行;如果数据量大,建议采用并行方式来执行 System.out.println("totalSize:"+sliceResponse.getTotalSize()); System.out.println("realSize size:"+sliceResponse.getDatas().size()); }
并行
/** * 并行方式执行slice scroll操作 */ @Test public void testSimpleSliceScrollApiParral() { ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll slice分页检索,max对应并行度,一般设置为与索引表的shards数一致 int max = 6; Map params = new HashMap(); params.put("sliceMax", max);//这里设置6个slice,建议不要大于索引表的shards数,必须使用sliceMax作为变量名称 params.put("size", 100);//每页100条记录 //scroll上下文有效期2分钟,每次scroll检索的结果都会合并到总得结果集中;数据量大时存在oom内存溢出风险,大数据量时可以采用handler函数来处理每次scroll检索的结果(后面介绍) ESDatas<Map> sliceResponse = clientUtil.scrollSlice("demo/_search", "scrollSliceQuery", params,"2m",Map.class, true);//true表示并行,会从slice scroll线程池中申请sliceMax个线程来并行执行slice scroll检索操作,大数据量多个shared分片的情况下建议采用并行模式 System.out.println("totalSize:"+sliceResponse.getTotalSize()); System.out.println("realSize size:"+sliceResponse.getDatas().size()); }
5.slice api使用与自定义scorll结果集handler函数结合使用
串行
/** * 串行方式执行slice scroll操作 */ @Test public void testSimpleSliceScrollApiHandler() { ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll slice分页检索,max对应并行度,一般设置为与索引表的shards数一致 int max = 6; Map params = new HashMap(); params.put("sliceMax", max);//这里设置6个slice,建议不要大于索引表的shards数,必须使用sliceMax作为变量名称 params.put("size", 1000);//每页1000条记录 //采用自定义handler函数处理每个slice scroll的结果集后,sliceResponse中只会包含总记录数,不会包含记录集合 //scroll上下文有效期1分钟,大数据量时可以采用handler函数来处理每次scroll检索的结果,规避数据量大时存在的oom内存溢出风险 ESDatas<Map> sliceResponse = clientUtil.scrollSlice("demo/_search", "scrollSliceQuery", params,"1m",Map.class, new ScrollHandler<Map>() { public void handle(ESDatas<Map> response) throws Exception {//自己处理每次scroll的结果 List<Map> datas = response.getDatas(); long totalSize = response.getTotalSize(); System.out.println("totalSize:"+totalSize+",datas.size:"+datas.size()); } }, false);//false表示串行,如果数据量大建议采用并行模式 long totalSize = sliceResponse.getTotalSize(); System.out.println("totalSize:"+totalSize); }
并行
/** * 并行方式执行slice scroll操作 */ @Test public void testSimpleSliceScrollApiParralHandler() { ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/scroll.xml"); //scroll slice分页检索,max对应并行度,一般设置为与索引表的shards数一致 int max = 6; Map params = new HashMap(); params.put("sliceMax", max);//这里设置6个slice,建议不要大于索引表的shards数,必须使用sliceMax作为变量名称 params.put("size", 1000);//每页1000条记录 //采用自定义handler函数处理每个slice scroll的结果集后,sliceResponse中只会包含总记录数,不会包含记录集合 //scroll上下文有效期1分钟,大数据量时可以采用handler函数来处理每次scroll检索的结果,规避数据量大时存在的oom内存溢出风险 ESDatas<Map> sliceResponse = clientUtil.scrollSlice("demo/_search", "scrollSliceQuery", params,"1m",Map.class, new ScrollHandler<Map>() { public void handle(ESDatas<Map> response) throws Exception {//自己处理每次scroll的结果,注意结果是异步检索的 List<Map> datas = response.getDatas(); long totalSize = response.getTotalSize(); System.out.println("totalSize:"+totalSize+",datas.size:"+datas.size()); } }, true);//true表示并行,会从slice scroll线程池中申请sliceMax个线程来并行执行slice scroll检索操作,大数据量多个shared分片的情况下建议采用并行模式 long totalSize = sliceResponse.getTotalSize(); System.out.println("totalSize:"+totalSize); }
我们可以在application.properties文件中增加以下配置来设置slice scroll查询线程池线程数和等待队列长度:
elasticsearch.sliceScrollThreadCount 默认值500
elasticsearch.sliceScrollThreadQueue 默认值500
猜你喜欢
- 2024-10-14 Excel表格太大时,怎么打印到一页上?
- 2024-10-14 写给Java应用开发者的Elasticsearch调优手册
- 2024-10-14 Excel表格太大时,怎么打印到一页上?收藏
- 2024-10-14 Excel中如何设置自动分页打印(excel表格怎么设置分页打印)
- 2024-10-14 还在浪费A4纸?按下Excel这个按钮,所有内容即可打印在同一页
- 2024-10-14 滑动页面时的控件设计规范——吸底&锚点
- 2024-10-14 ElasticSearch优化点简述(elasticsearch集群优化)
- 2024-10-14 一组Excel打印技巧,实用就好(excel打印技巧大全)
- 2024-10-14 打印设置用得好,天天追着幸福跑(打印基本设置)
- 2024-10-14 VBA实用代码赏析之八:页面、日期函数及选择的操作
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)