Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询

本文主要是介绍Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Elasticsearch"滚动查询"(Scrolling)的机制的与Java使用ES Client 调用滚动查询

  • 前言
  • 1. 滚动查询的一般步骤
    • 1.1 发起初始搜索请求,返回命中结果和滚动ID
    • 1.2 使用滚动ID检索下一页结果
    • 1.4 重复执行直到没有检索结果返回
    • 1.5 清除滚动上下文释放资源
  • 2.Java Elasticsearch客户端执行滚动查询
  • 3. SpringDataElasticsearch滚动查询

前言

ES在进行普通的查询时,默认只会查询出来10条数据。我们通过设置es中的size可以将最终的查询结果从10增加到10000。如果需要查询数据量大于es的翻页限制或者需要将es的数据进行导出又当如何?
Elasticsearch提供了一种称为"滚动查询"(Scrolling)的机制,用于处理大型数据集的分页查询。滚动查询允许在持续的时间段内保持一个活动的搜索上下文,然后使用滚动ID进行迭代检索结果。滚动查询和关系型数据库中的游标有点类似,因此也叫游标查询

1. 滚动查询的一般步骤

1.1 发起初始搜索请求,返回命中结果和滚动ID

scroll=5m表示每个滚动查询的有效时间为5分钟

POST /your_index/_search?scroll=5m
{"size": 100,       // 每次返回的结果数量"query": { ... }   // 查询条件
}

命中结果:

{"_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==","hits": {"total": {"value": 10000,"relation": "eq"},"hits": [ ... ]  // 检索到的文档}
}

示例:
在这里插入图片描述

1.2 使用滚动ID检索下一页结果

POST /_search/scroll
{"scroll": "5m","scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

示例:

POST /_search/scroll{"scroll": "5m","scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFDJPRXc0WWdCY1BLWlo1MTk4MmR3AAAAAAAAAXYWcWgwSW5CQUtScEd2T2QtRGtYaWliQQ=="}

在这里插入图片描述

1.4 重复执行直到没有检索结果返回

Elasticsearch将返回下一页结果和一个新的滚动ID。可以根据需要重复这个步骤,直到没有更多结果为止

1.5 清除滚动上下文释放资源

滚动查询结束后,您可以通过发送一个清除滚动上下文的请求来释放资源:

DELETE /_search/scroll
{"scroll_id": ["DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="]
}

以上为滚动查询进行分页检索的基本过程。在每个滚动请求中,都需要提供先前滚动请求返回的滚动ID。这样Elasticsearch才能够维护搜索上下文并返回正确的结果

2.Java Elasticsearch客户端执行滚动查询

public static void main(String[] args) {long start = System.currentTimeMillis();//构建es HttpHost对象HttpHost httpHost1 = new HttpHost("192.168.1.1", 9200, "http");// 滚动时间窗口long scrollTime = 1L;// 每次返回的文档数量int batchSize = 20000;//索引名String indexName = "你的索引名称";try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHost1))) {//构建查询请求SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.boolQuery());searchSourceBuilder.size(batchSize);//设置查询返回字段String[] includes = {};searchSourceBuilder.fetchSource(includes, null);// 滚动查询请求SearchRequest searchRequest = new SearchRequest(indexName);searchRequest.source(searchSourceBuilder);//设置请求滚动时间窗口时间searchRequest.scroll(TimeValue.timeValueMinutes(scrollTime));//执行首次检索SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//首次检索返回scrollId,用于下一次的滚动查询String scrollId = searchResponse.getScrollId();//获取首次检索命中结果SearchHit[] searchHits = searchResponse.getHits().getHits();//计数int count = 0;// 处理第一批结果for (SearchHit hit : searchHits) {// 处理单个文档JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());System.out.println("====对首次请求的进行处理,当前计数:" + count++);}// 处理滚动结果while (searchHits != null && searchHits.length > 0) {SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);scrollRequest.scroll(TimeValue.timeValueMinutes(scrollTime));searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);scrollId = searchResponse.getScrollId();searchHits = searchResponse.getHits().getHits();for (SearchHit hit : searchHits) {JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());System.out.println("====滚动查询,当前计数:" + count++);}}// 清理滚动上下文ClearScrollRequest clearScrollRequest = new ClearScrollRequest();clearScrollRequest.addScrollId(scrollId);ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);boolean succeeded = clearScrollResponse.isSucceeded();long end = System.currentTimeMillis();System.out.println("共执行时间:" + (end - start) / 1000 + " s");} catch (Exception e) {System.out.println("===error==" + e.getMessage());e.printStackTrace();}
}

3. SpringDataElasticsearch滚动查询

import org.elasticsearch.action.search .*;
import org.elasticsearch.client .*;
import org.elasticsearch.common.unit .*;
import org.elasticsearch.index.query .*;
import org.elasticsearch.search .*;
import org.elasticsearch.search.builder .*;
import org.springframework.beans.factory.annotation .*;
import org.springframework.data.elasticsearch.core .*;
import org.springframework.data.elasticsearch.core.query .*;public class ScrollSearchExample {@Autowiredprivate ElasticsearchOperations elasticsearchOperations;public void performScrollSearch() {String scrollTime = "1m";  // 滚动时间窗口int batchSize = 100;  // 每次返回的文档数量QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();searchQuery.withQuery(queryBuilder).withPageable(PageRequest.of(0, batchSize)).build();SearchResponse searchResponse = elasticsearchOperations.startScroll(scrollTime,searchQuery,YourEntityClass.class,IndexCoordinates.of("your_index"));String scrollId = searchResponse.getScrollId();SearchHits<YourEntityClass> searchHits = searchResponse.getSearchHits();// 处理第一批结果for (SearchHit<YourEntityClass> hit : searchHits) {YourEntityClass entity = hit.getContent();// 处理单个文档}// 处理滚动结果while (searchHits != null && searchHits.hasSearchHits()) {searchResponse = elasticsearchOperations.continueScroll(scrollId, scrollTime, YourEntityClass.class);scrollId = searchResponse.getScrollId();searchHits = searchResponse.getSearchHits();for (SearchHit<YourEntityClass> hit : searchHits) {YourEntityClass entity = hit.getContent();// 处理单个文档}}// 清理滚动上下文elasticsearchOperations.clearScroll(scrollId);}
}

这篇关于Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160902

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.