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

news2024/9/22 7:21:17

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 {

    @Autowired
    private 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);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统开发】尚硅谷 - 谷粒商城项目笔记(八):Seata分布式事务

文章目录 Seata分布式事务简介事务的隔离级别事务传播行为本地事务[Transactional](https://so.csdn.net/so/search?qTransactional&spm1001.2101.3001.7020)传播行为分布式事务CAP理论分布式事务常见解决方案2PC(两阶段提交&#xff0c;刚性事务)TCC&#xff08;柔性事务…

头一次见单例模式讲的如此透彻

简介 单例模式是一种常用的软件设计模式&#xff0c;用于创建类型。通过单例模式的方法创建的类在当前进程中只有一个实例。单例模式的类只能允许一个实例存在。单例模式的作用是保证在整个应用程序的生命周期中&#xff0c;任何一个时刻&#xff0c;单例类的实例都只存在一个…

【springboot整合】Spring缓存抽象

JSR-107简介 为了统一缓存开发规范&#xff0c;以及提升缓存开发的扩展性&#xff0c;J2EE发布了JSR-107缓存开发规范。 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider、CacheManger、Cache、Entry和Expiry CachingProvider&#xff1a;定义了创建、配置…

基于Java毕业论文管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Redis【入门篇】---- Redis常见命令

Redis【入门篇】---- Redis常见命令 1. Redis数据结构介绍2. Redis 通用命令3. Redis命令-String命令4. Redis命令-Key的层级结构5. Redis命令-Hash命令6. Redis命令-List命令7. Redis命令-Set命令8. Redis命令-SortedSet类型 1. Redis数据结构介绍 Redis是一个key-value的数据…

调查问卷Type Form的集成

简介 Typeform是一家制作线上调查问卷的公司。 Muoz 和 David Okuniev两人于2012年创作出一个更加动态、更具交互性的用户调查工具&#xff0c;每次只提一个问题&#xff0c;并且根据用户的回答为其呈现下一个问题&#xff0c;像和朋友间的对话一样&#xff0c;让用户在不知不…

边缘计算开源平台

边缘计算 文章目录 边缘计算前言01 边缘计算开源平台概述02 面向物联网端的边缘计算开源平台2.1 EdgeXFoundry2.2 ApacheEdgent 03 面向边缘云的边缘计算开源平台3.1 CORD3.2 Akraino EdgeStack 04 面向云边融合的边缘计算开源平台05 构建边缘计算平台的开源软件06 结束语 前言…

类皮肤全属性凝胶电子皮肤

目前电子皮肤相关工作仅①提升单一或几个刺激感知属性&#xff08;压力、温度等&#xff09;&#xff1b;②研究部分理化属性和感知属性的结合。但这些工作仅覆盖皮肤的两种或三种属性&#xff0c;距离实现皮肤般丰富的刺激感知感官和理化特性还有很大差距。而覆盖人类皮肤的所…

linux-virtualbox安装centOS7.9

一、windows10安装virtualbox 安装包->右键->以管理员身份运行->下一步 ->选择安装位置->下一步 ->是&#xff08;网络中断&#xff1f;&#xff09; ->是&#xff08;安装一些辅助工具包&#xff09; ->安装 ->完成 二、virtualbox新建centOS7.9虚…

【Python 基础篇】Python 文件操作

文章目录 导言一、文件操作的作用二、文件的基本操作1、打开文件2、读写文件① 读取文件② 写入文件 3、关闭文件 三、文件备份四、文件和文件夹的操作结语 导言 在编程领域中&#xff0c;文件操作是一项基础且常见的任务。无论是读取配置文件、处理数据文件&#xff0c;还是备…

MySQL保姆安装教程

文章目录 前言一、MySQL官网二、离线安装包步骤三、环境配置四、验证安装是否成功在这里插入图片描述 五、可视化工具连接总结 前言 对于第一次安装mysql是有点难度&#xff0c;现在我会把安装流程搞出来。 一、MySQL官网 MySQL Installer 8.0.33安装&#xff08;不想安装这个…

Windows下redis的安装与使用

一、下载 redis.io 官网没有Windows版本的&#xff0c;需要去redis-windows下载。 二、使用与配置 2.1 解压安装 redis的Windows版本&#xff0c;有.msi和.zip两种格式。这里使用更为方便&#xff0c;直接解压就可以使用的.zip格式。 将Redis-x64-5.0.14.1.zip解压至D盘的…

【Java-SpringBoot+Vue+MySql】Day3.3-MybatisPlus说明与使用

目录 一、MybatisPlus快速入门 1、知识轰炸 2、实操演练 &#xff08;1&#xff09;新建项目 &#xff08;2&#xff09;添加依赖 &#xff08;3&#xff09;添加配置 &#xff08;4&#xff09;添加映射层 &#xff08;5&#xff09;启动类中添加注解 &#xff08;6&a…

【通过Data Studio连接openGauss】---快速入门

【通过Data Studio连接openGauss】---快速入门 &#x1f53b; 一、访问openGauss&#x1f530; 1.1 确认连接信息&#xff08;单节点&#xff09;&#x1f530; 1.2 使用gsql访问openGauss&#xff08;本地连接数据库&#xff09;&#x1f530; 1.3 使用gsql访问openGauss&…

玩机搞机------安卓手机分区操作中的的各种工具 提取分区 备份分区 檫除分区 推荐一

喜欢玩机搞机的朋友们经常对手机系统进行安装玩机操作。但有时候指令类输入和操作步骤比较繁琐。耽误时间。有些工具就比较方便操作。陆续会整理一些玩机搞机中的简单工具给爱好者使用。本期整理一些关于手机分区的工具推荐 &#x1f494;&#x1f494;&#x1f494; AB AVB分…

Android的详细介绍

目录&#xff1a; Android诞生 Android系统架构 Android系统版本 Android应用开发特色 Android诞生 2003年10月&#xff0c;Andy Rubin等人创建了Android公司&#xff0c;并组建了Android团队。 2005年8月17日&#xff0c;Google低调收购了成立仅22个月的高科技企…

【新星计划·2023】Linux目录结构

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Linux目录结构与功能&#xff0c;以及目录解释&#xff0c;最近这段时间会持续更新关于Linux的基础知识&#xff0c;期待你的…

机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…

macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.7 (21G651) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…

macOS Big Sur 11.7.8 (20G1351) 正式版 ISO、PKG、DMG、IPSW 下载

macOS Big Sur 11.7.8 (20G1351) 正式版 ISO、PKG、DMG、IPSW 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Window…