`

Elasticsearch Scroll和Slice Scroll查询API使用案例

阅读更多
Elasticsearch Scroll和Slice Scroll查询API使用案例

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

本文内容

  • 基本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


6 开发交流
elasticsearch技术交流群:166471282

elasticsearch微信公众号:
1
0
分享到:
评论

相关推荐

    ElasticSearch Java API 中文文档

    标题《ElasticSearch Java API 中文文档》表明本篇文档的主要内容是关于ElasticSearch的Java API的中文使用说明和相关知识点介绍。ElasticSearch是一个基于Lucene构建的开源搜索引擎,它提供了一个分布式、多用户...

    ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端

    Elasticsearch查询客户端是用于与ES服务器通信的软件,它们提供了多种语言的API,允许开发者以编程方式执行索引、搜索、更新和删除等操作。常见的Elasticsearch客户端包括: - **Jest**:一个轻量级的Java REST...

    Elasticsearch查询API

    【Elasticsearch查询API】是Elasticsearch中用于检索数据的核心功能,允许用户通过各种查询语句和过滤条件从索引中获取相关文档。本文将详细介绍Elasticsearch接口API的使用,特别是全文检索、查询匹配以及常用的...

    elasticsearch-scroll-stream:Elasticsearch Scroll查询结果作为可读的Node.js流

    Elasticsearch滚动流 Elasticsearch Scroll查询结果作为Node.js可读流。 此模块可与官方Elasticsearch Node.js客户端一起使用: (新的Elasticsearch js API) (旧的Elasticsearch js API)原料药...

    elasticsearch-6.2.3-API文档-中文版.zip

    赠送原API文档:elasticsearch-6.2.3-javadoc.jar; 赠送源代码:elasticsearch-6.2.3-sources.jar; 赠送Maven依赖信息文件:elasticsearch-6.2.3.pom; 包含翻译后的API文档:elasticsearch-6.2.3-javadoc-API文档...

    elasticsearch-6.8.3-API文档-中文版.zip

    赠送原API文档:elasticsearch-6.8.3-javadoc.jar; 赠送源代码:elasticsearch-6.8.3-sources.jar; 赠送Maven依赖信息文件:elasticsearch-6.8.3.pom; 包含翻译后的API文档:elasticsearch-6.8.3-javadoc-API文档...

    springboot 集成elasticsearch ,api的使用

    在本文中,我们将深入探讨如何将Spring Boot与Elasticsearch集成,并使用其API进行数据操作。Elasticsearch是一个流行的开源搜索引擎,它提供了实时、分布式、容错能力的搜索和数据分析功能。Spring Boot则是一个...

    elasticsearch-6.3.0-API文档-中文版.zip

    赠送原API文档:elasticsearch-6.3.0-javadoc.jar; 赠送源代码:elasticsearch-6.3.0-sources.jar; 赠送Maven依赖信息文件:elasticsearch-6.3.0.pom; 包含翻译后的API文档:elasticsearch-6.3.0-javadoc-API文档...

    JAVA使用ElasticSearch查询in和not in的实现方式

    使用Elasticsearch查询in和not in的实现方式可以满足我们各种查询需求,提高我们的开发效率和查询速度。 本文总结了使用Elasticsearch查询in和not in的实现方式,希望对大家的学习或者工作具有一定的参考价值。

    基于Elasticsearch Java API的参考手册

    通过深入理解和熟练运用Elasticsearch的Java API,开发者可以构建出高效、可扩展的搜索和分析解决方案,充分挖掘大数据的潜力。这份"基于Elasticsearch Java API的参考手册"将提供详细指南,帮助开发者掌握这些关键...

    Elasticsearch API

    无论是使用Elasticsearch进行数据搜索、分析还是数据聚合,了解其核心概念、集群架构和API的使用,都是非常必要的。通过阅读官方文档、参考书籍和社区分享,可以快速入门Elasticsearch,并在实际项目中得到有效应用...

    JAVA实现ElasticSearch的简单实例

    2. **Java API**:Elasticsearch提供了Java REST客户端,使得开发者可以直接通过Java代码与ES集群进行交互。这个API简化了与ES通信的复杂性,并且性能高效。 3. **Elasticsearch安装与配置**:在开始编写Java程序...

    elasticsearch离线JAVA API文档下载

    **Elasticsearch离线Java API文档详解** Elasticsearch(简称ES)是...离线下载的Java API文档是开发者不可或缺的学习和参考资源,它详细解释了每个方法的使用和示例,帮助我们更好地理解和利用Elasticsearch的功能。

    Elasticsearch5.x Java API手册

    Elasticsearch 5.x 版本的 Java API 手册是开发者进行 Elasticsearch 相关开发的重要参考资料。Elasticsearch 是一个流行的开源全文搜索引擎,广泛应用于数据检索、分析和实时数据存储。Java API 提供了与 Elastic...

    使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示

    在本文中,我们将深入探讨如何使用Java调用Elasticsearch(ES)提供的API进行数据搜索。Elasticsearch是一个流行的开源全文搜索引擎,具有分布式、实时、可扩展性等特性,广泛应用于大数据分析和日志检索等领域。...

    elasticsearch5.6以上version通用java API

    在Java环境中与Elasticsearch交互,通常会使用官方提供的Java REST客户端。然而,官方API可能无法涵盖所有实际开发中的需求,因此需要深入理解并扩展API来实现更多功能。在"elasticsearch5.6以上version通用java API...

    ElasticSearch Java API

    **Elasticsearch Java API**是Elasticsearch与Java应用程序交互的主要工具,它允许开发者在Java环境中无缝地创建、管理和查询Elasticsearch索引。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,用于...

    elasticsearch java api

    Elasticsearch Java API是开发Elasticsearch应用时常用的一个接口,它允许开发者使用Java语言与Elasticsearch集群进行交互。由于“隔壁的30分比较老,基本上都用不了”,这可能指的是早期版本的教程或API已经过时,...

    基于.netcore搜索封装ElasticSearch.zip

    在.NET Core中使用Elasticsearch,可以借助各种客户端库,实现与Elasticsearch服务器的交互,执行索引、查询、更新和删除等操作。 这个"TCT.Net.Base.ElasticSearch"库很可能是一个封装了Elasticsearch.NET和Nest的...

Global site tag (gtag.js) - Google Analytics