当前位置: 首页 > news >正文

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询

Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制,特别是在需要从索引中检索大量数据时。通常情况下,Elasticsearch 的搜索请求会有一个结果集大小的限制 (from+size 的检索数量默认是 10,000 条记录),而 Scroll API 允许你绕过这个限制,通过滚动的方式逐步获取数据

关键概念

  • Scroll Context(滚动上下文)
    • 当你第一次发起一个滚动请求时,Elasticsearch 会创建一个滚动上下文。这个上下文保存了搜索的状态和位置,以便在后续请求中继续检索数据
    • 滚动上下文是有状态的,它在服务器端保存了一段时间 (由你指定的超时时间决定)
  • Scroll ID(滚动 ID)
    • 每次滚动请求都会返回一个scrollId,这是一个唯一标识符,用于标识和管理滚动上下文
    • 你需要在后续的滚动请求中提供这个scrollId,以便 Elasticsearch 知道从哪里继续检索数据
  • Timeout(超时时间)
    • 你可以为滚动上下文指定一个超时时间,这个时间决定了滚动上下文在服务器端保持活跃的时间
    • 如果在超时时间内没有新的滚动请求,滚动上下文会被自动清除

工作原理

  • 初始请求
    • 你首先发起一个搜索请求,并指定滚动参数 (如超时时间)。这个请求会返回初始的搜索结果和一个scrollId
  • 后续请求
    • 使用返回的scrollId发起后续的滚动请求。每个请求都会返回一批新的结果和一个新的scrollId
    • 你继续使用新的scrollId进行后续请求,直到没有更多结果返回
  • 清除滚动上下文
    • 当你完成数据检索后,应该显式地清除滚动上下文,以释放服务器资源。这可以通过ClearScrollRequest来实现

Java 实现

package com.xxx;import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.enthusa.avatar.core.utils.DateUtil;
import org.enthusa.avatar.utils.task.TaskModel;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class ESScrollTask extends AbstractTask {private static final String[] INCLUDE_FIELDS = {"entity_id", "job_name", "job_city", "edu_level", "locations", "company_id", "career_job_id2", "salary"};private static final String[] EXCLUDE_FIELDS = {};public static final int ES_EACH_SIZE = 500;public static final int ES_TOTAL_SIZE = 10000;@Resourceprotected RestHighLevelClient utEsClient;private List<PlatformJob> termSearchWithScroll(Integer recruitType) {final long scrollTimeout = 60000;List<PlatformJob> platformJobs = new ArrayList<>();try {SearchRequest searchRequest = new SearchRequest(Constants.ES_JOB_ITEM);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 自定义查询语句searchSourceBuilder.query(buildQuery(recruitType));searchSourceBuilder.fetchSource(INCLUDE_FIELDS, EXCLUDE_FIELDS);searchSourceBuilder.size(ES_EACH_SIZE);searchRequest.source(searchSourceBuilder);// 滚动查询及超时时间searchRequest.scroll(TimeValue.timeValueMillis(scrollTimeout));SearchResponse searchResponse = utEsClient.search(searchRequest, RequestOptions.DEFAULT);String scrollId = searchResponse.getScrollId();SearchHit[] searchHits = searchResponse.getHits().getHits();while (searchHits != null && searchHits.length > 0 && platformJobs.size() < ES_TOTAL_SIZE) {for (SearchHit hit : searchHits) {// 自定义业务PlatformJob platformJob = new PlatformJob();platformJob.setJobId(IdMapping.toId((Long) hit.getSourceAsMap().get("entity_id")));platformJob.setJobName((String) hit.getSourceAsMap().get("job_name"));platformJob.setJobCity((String) hit.getSourceAsMap().get("job_city"));platformJob.setEducation(eduLevelMap.get((Integer) hit.getSourceAsMap().get("edu_level")));platformJob.setLocations((String) hit.getSourceAsMap().get("locations"));platformJob.setCompanyId((Integer) hit.getSourceAsMap().get("company_id"));platformJob.setCareerJobId2((Integer) hit.getSourceAsMap().get("career_job_id2"));platformJob.setSalary((String) hit.getSourceAsMap().get("salary"));platformJobs.add(platformJob);}SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);scrollRequest.scroll(TimeValue.timeValueMillis(scrollTimeout));searchResponse = utEsClient.scroll(scrollRequest, RequestOptions.DEFAULT);scrollId = searchResponse.getScrollId();searchHits = searchResponse.getHits().getHits();}// 清除滚动上下文ClearScrollRequest clearScrollRequest = new ClearScrollRequest();clearScrollRequest.addScrollId(scrollId);utEsClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);} catch (Exception e) {log.info("es search error", e);return Collections.emptyList();}return platformJobs;}public BoolQueryBuilder buildQuery(Integer recruitType) {BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();queryBuilder.filter(QueryBuilders.termQuery("content_type", IdType.PLATFORM_JOB.toString()));queryBuilder.filter(QueryBuilders.termQuery("status", 0));queryBuilder.filter(QueryBuilders.termQuery("recruit_type", recruitType));return queryBuilder;}
}

相关文章:

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制&#xff0c;特别是在需要从索引中检索大量数据时。通常情况下&#xff0c;Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...

MySQL 内存使用率常用分析语句

最近连续遇到MySQL内存占用过高导致服务器内存不足的问题&#xff0c;整理下收集到的常用分析语句 一、 OS层 首先需要确认是否是MySQL占用的内存 top -p $(pidof mysqld) -n 1 或者 cat /proc/$(pidof mysqld)/status 二、 DB层 1. 全局情况 各种buffer pool大小&#xf…...

L20.【LeetCode笔记】用栈实现队列(方法2)(★详解★)

目录 1.实现方法 过程详解 1.执行push 1->push 2->push 3->push 4 2.执行第一个pop 3.执行第二个pop 4.执行push 5->push 6 ​编辑 5.执行pop->pop->pop 代码实现 队列创建函数myQueueCreate 入队函数myQueuePush 出队函数myQueuePop 返回队列开头…...

PR蒙太奇

简介 蒙太奇是将不同的镜头鬓角在一起&#xff0c;已不同的时间、地点来表现人物、环境、情节等&#xff0c;有时会产生意想不到的想过。广义上来说&#xff0c;这种剪接做法就是蒙太奇&#xff0c;是由镜头组合构成的隐式语言。 含义 镜头组接技巧 叙事蒙太奇&#xff1a;…...

高中数学:计数原理-排列组合

文章目录 一、排列排列数例题 二、组合组合数例题 三、使用方法总结 一、排列 排列数 例题 二、组合 组合数 例题 三、使用方法总结 组合&#xff1a;从n个元素中抽取m个元素&#xff0c;不排序&#xff0c;则用组合计算 排列&#xff1a;从n个元素中抽取m个元素&#xff0c;再…...

pytorch中有哪些归一化的方式?

在 PyTorch 中&#xff0c;归一化是一种重要的操作&#xff0c;用于调整数据分布或模型参数&#xff0c;以提高模型的训练效率和性能。以下是常见的归一化方式及其应用场景&#xff1a; 1. 数据归一化 &#xff08;1&#xff09;torch.nn.functional.normalize 对输入张量沿…...

Next.js系统性教学:增量静态再生成 (ISR) 完全解析

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 什么是增量静态再生成 (ISR)? 1.1 传统的静态生成与挑战 1.2 增量静态再生成&#xff08;ISR&#xff09;的出现 2. 如何使用增量静态再生成&#xff08;ISR&…...

视频编辑技术的发展:AI技术在小咖视频混剪中的应用

随着数字技术的飞速发展&#xff0c;视频编辑领域也迎来了革命性的变化。AI技术的引入&#xff0c;使得视频编辑变得更加智能和高效。本文将探讨AI技术在视频混剪领域的应用&#xff0c;并介绍一些实用的工具&#xff0c;帮助用户提升视频编辑的效率和质量。 视频演示 AI技术在…...

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么&#xff1f; JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…...

Python并发编程全解析

一、前言 在现代开发中,并发编程是提高性能、响应速度的关键技术之一。Python提供了多种实现并发的方式,如多线程、多进程和异步IO。本篇文章将逐一解析这些技术,探讨其适用场景,并通过代码示例帮助理解。 二、并发编程的核心概念 1. 并发与并行 并发:任务在时间片上交替…...

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…...

每日十题八股-2024年12月7日

1.说说hashmap的负载因子 2.Hashmap和Hashtable有什么不一样的&#xff1f;Hashmap一般怎么用&#xff1f; 3.ConcurrentHashMap怎么实现的&#xff1f; 4.分段锁怎么加锁的&#xff1f; 5.分段锁是可重入的吗&#xff1f; 6.已经用了synchronized&#xff0c;为什么还要用CAS呢…...

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…...

PyQt5快速开发与实战

PyQt5快速开发与实战相关资源 PyQt5快速开发与实战配套代码资源获取 PyQt5快速开发与实战 第一个要跟大家分享的就是的《PyQt5快速开发与实战》。该书既涵盖了 PyQt5 的基础知识&#xff0c;又包含了实战应用技巧&#xff0c;对 PyQt5 的基本概念和技术细节进行了详细阐述&…...

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令&#xff1a; 【前端小程序地址】(3.0)&#xff1a;伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0)&#xff1a;伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0)&#xff1a;动作火器智汇堂多好/~dd69356K6r~:/复制口令…...

cmake: error while loading shared libraries: libssl.so.1.1

在ubuntu22.04中编译c文件时出现如下错误&#xff1a; cmake: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 解决办法&#xff1a;1.进网站下载对应的.deb文件&#xff0c;链接为&#xff1a;https://sec…...

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位&#xff0c;需要研发自己部署日志系统&#xff0c;elk…...

后端-编辑按钮的实现

编辑一共要实现两步&#xff1a; 1.点击编辑蹦出来一个弹窗&#xff0c;此时需要回显&#xff0c;根据id查出来这条数据 2.修改某些值之后点击保存的时候调用修改的接口 根据id查询的时候正常操作 修改值的时候要注意一些问题 mapper层的Employee和impl层的接收实体不一样...

uniapp中的@tap与@click:点击事件的微妙差异

在uniapp的开发过程中&#xff0c;我们经常会遇到两种点击事件&#xff1a;tap和click。虽然它们都是点击事件&#xff0c;但在实际使用中却存在一些微妙的差异。本文将详细解析这两种事件的区别&#xff0c;帮助开发者更好地理解和应用。 首先&#xff0c;让我们来看看它们的…...

Uniapp的vue、nvue、uvue后缀名区别

在 UniApp 中&#xff0c;.vue、.nvue 和 .uvue 是不同的文件后缀名&#xff0c;每个文件格式的使用场景和兼容性略有不同。下面是每个文件后缀的详细解释以及它们的兼容性&#xff1a; 1. .vue 文件 定义&#xff1a;.vue 是标准的 Vue 单文件组件格式&#xff0c;主要用于基…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...