Java ES 滚动查询

滚动查询(Scroll Query)是 Elasticsearch 提供的一种机制,用于处理大量数据的查询。它允许你在多个请求之间保持"游标",以便在后续请求中获取更多的结果。

以下是滚动查询的基本工作原理:

1 初始查询:

客户端发送一个查询请求给 Elasticsearch,并指定一个滚动时间(scroll time)。

2 首次返回结果:

Elasticsearch会处理这个查询请求,并将结果返回给客户端。

除了返回查询结果之外,还会返回一个特殊的"滚动ID"(scroll ID)。

3 保持连接:

客户端将这个滚动ID保存下来,以便在后续请求中使用。

4 后续查询:

在滚动时间内,客户端可以使用保存的滚动ID来获取更多的结果,而不需要重新发送完整的查询请求。

客户端发送一个滚动请求,并提供之前收到的滚动ID。

5 返回后续结果:

Elasticsearch会使用之前的滚动ID来获取接下来的结果,并将其返回给客户端。

如果有更多的结果可用,它也会返回一个新的滚动ID,以便在下一次请求中使用。

6 重复步骤4和步骤5:

客户端可以在滚动时间内多次使用滚动ID来获取更多的结果,直到没有更多的结果可用为止。

7 滚动ID的失效:

一旦滚动时间过期(在初始查询时指定的时间),或者客户端主动关闭滚动查询,相应的滚动ID将失效,不再能用于获取结果。

滚动查询的优点在于,它允许你在多个请求之间保持连接状态,从而能够处理大量数据而不会因为单次请求的数据量过大而出现问题。

需要注意的是,滚动查询并不适用于实时查询,因为它会保持资源开销,直到滚动时间过期或者显式关闭滚动查询为止。因此,滚动查询通常用于离线批量处理或需要处理大量数据的情况。

java 复制代码
@Test
public void searchScroll() {
	long gte = 0;
	long lt = 100000000;

	BoolQueryBuilder query = new BoolQueryBuilder();
	query.must(QueryBuilders.rangeQuery("createTime").gte(gte).lt(lt));

	NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
	builder.withPageable(PageRequest.of(0, 500)); // 每次只处理500条数据
	builder.withQuery(query);

	// 查询
	IndexCoordinates index = "student";
	SearchScrollHits<Student> hits = template.searchScrollStart(
			60000L,
			builder.build(),
			Student.class,
			index);

	String scrollId = hits.getScrollId();
	List<String> scrollIdList = new LinkedList<>();
	scrollIdList.add(scrollId);

	List<CheckItemCount> list = new LinkedList<>();
	while (hits.hasSearchHits()) {

		// 处理数据
		List<SearchHit<Student>> hitList = hits.getSearchHits();
		for (SearchHit<Student> hit : hitList) {
			// 处理数据
		}
		
		// 滚动查询下一页
		hits = template.searchScrollContinue(scrollId, 60000L, Student.class, index);
		scrollId = hits.getScrollId();
		scrollIdList.add(scrollId);
		
	}
	// 清空滚动查询
	template.searchScrollClear(scrollIdList);
}
相关推荐
qq_37711237几秒前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(1)-06
java·开发语言·jvm
学编程就要猛4 分钟前
算法:2.复写零
java·数据结构·算法
韩立学长7 分钟前
【开题答辩实录分享】以《植物园信息管理系统》为例进行选题答辩实录分享
java·数据库·spring
嘻哈baby7 分钟前
记一次线上OOM排查,JVM调优全过程
java
a程序小傲8 分钟前
京东Java面试被问:垃圾收集算法(标记-清除、复制、标记-整理)的比较
java·算法·面试
austin流川枫9 分钟前
深度解析六大Java微服务框架
java·后端·微服务
froginwe1110 分钟前
HTML 标题
开发语言
悠哉悠哉愿意13 分钟前
【嵌入式学习笔记】任务调度器
开发语言·笔记·单片机·嵌入式硬件·学习
笨蛋少年派16 分钟前
Shell脚本编程(bash)简述
开发语言·bash
毕设源码-赖学姐17 分钟前
【开题答辩全过程】以 高校贫困生资助管理系统为例,包含答辩的问题和答案
java·eclipse