ElasticSearch6.x版本的Scroll滚动查询讲解及Kibana和SpringBoot实操演示

news2024/11/18 18:24:10

文章目录

  • 一、Scroll滚动查询介绍
  • 二、Kibana上操作
  • 三、SpringBoot中操作
  • 四、总结

一、Scroll滚动查询介绍

ElasticSearch中在进行普通的查询时,默认只会查询出来10条数据。我们通过设置ElasticSearch中的size可以将最终的查询结果从10增加到10000。但这时候如果我们需要查询的数据大于10000条怎么办呢?这时候有两种方法:深度分页滚动查询。在这里我们优选选择滚动查询因为深度分页越往后查性能越低,极其耗费内存和CPU

在介绍滚动查询之前,我们先简单了解下深度分页
深度分页其实就是用fromsize两个关键字实现的。如下图所示,from关键字可以指定从哪个位置开始搜索,size关键字可以指定搜索几条数据,但深度分页的搜索很深,对性能方面会带来很大的影响, 因此这种方式不推荐使用。

GET /online_house_achieve/house/_search
{
  "query": {"match_all": {}},
  "from": 10000,
  "size": 5
}

然后我们来了解下滚动查询
滚动查询,和关系型数据库中的游标有点类似,因此也叫游标查询。也相当于一个快照,它是ElasticSearch中提供的一种查询大数据量的方式。

二、Kibana上操作

要想使用滚动查询,我们只需要在_search后面加上scroll就好了。

GET /online_house_achieve/house/_search?scroll=1m
{
  "query": {"match_all": {}},
  "size": 1
}

这里有几个注意点

  • scroll表示这是一个scroll滚动查询。
  • scroll=1m表示查询的结果数据在ElasticSearch服务器中过期时间为1min
  • 查询完会返回一个_scroll_id,该字段其实就相当于一个书签,在我们之后的查询中需要带着这个书签,就可以一直往后根据设置的size大小获取数据(前提是在设置的过期时间之内)。mg.cn/34fe048fdea347cf99118d08ca134f8f.png)那问题来了,我们该如何使用这个_scroll_id实现进一步的滚动查询呢?我们直接看下面代码。
GET /_search/scroll/
{
  "scroll":"1m",
  "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAa5Fm9hLW9TeGtTU2NTWEI2bFpNbEJ0clEAAAAAAAAGtxZvYS1vU3hrU1NjU1hCNmxaTWxCdHJRAAAAAAAABroWb2Etb1N4a1NTY1NYQjZsWk1sQnRyUQAAAAAAAAa4Fm9hLW9TeGtTU2NTWEI2bFpNbEJ0clEAAAAAAAAGuxZvYS1vU3hrU1NjU1hCNmxaTWxCdHJR"
}

将获取的scroll_id作为条件继续查询即可,不需要再指定索引和类型。因为scroll_id具有唯一性,在过期时间内,之后查询的scroll_id是不变的

三、SpringBoot中操作

1.先在pom.xml里面引入依赖。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.然后在SpringBoot项目中增加以下配置。

这里我是用HTTP的方式进行连接,端口是9200。如果你们是用TCP方式进行连接的话,端口记得改成9300。

@Configuration
public class ESRestClientConfig extends AbstractElasticsearchConfiguration {

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("127.0.0.1:9200")
                .build();
        return RestClients.create(clientConfiguration).rest();
    }
}

3.然后写单元测试代码,实现滚动查询。

@Test
public void testESScroll() throws IOException {
    SearchRequest searchRequest = new SearchRequest();
    // 构造ElasticSearch查询条件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.size(1).query(QueryBuilders.matchAllQuery());
    // 设置scroll超时时间(10min)
    Scroll scroll = new Scroll(TimeValue.timeValueMinutes(10L));
    // 指定查询的索引和类型
    searchRequest.indices("online_house_achieve").types("house").scroll(scroll);
    SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    // 获取第一次查询的结果,并拿到scrollId滚动id
    SearchHit[] scrollHits = response.getHits().getHits();
    for (SearchHit hit : scrollHits) {
        logger.info(hit.getSourceAsString());
    }
    //记录滚动id。
    String scrollId = response.getScrollId();
    //滚动查询部分,将从第2条数据开始取。
    scrollHits = response.getHits().getHits();
    while (scrollHits != null && scrollHits.length > 0 ) {
        //构造滚动查询条件
        SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
        searchScrollRequest.scroll(scroll);
        //响应必须是上面的响应对象,需要对上一层进行覆盖。
        response = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
        scrollId = response.getScrollId();
        scrollHits = response.getHits().getHits();
        for (SearchHit hit : scrollHits) {
            logger.info(hit.getSourceAsString());
        }
    }
    // 数据获取完毕后需要清除滚动,否则影响下次查询
    ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
    clearScrollRequest.addScrollId(scrollId);
    ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
    //清除滚动是否成功
    boolean isSuccess = clearScrollResponse.isSucceeded();
    logger.info("=====================>清楚滚动scroll是否成功:{}",isSuccess);
}

四、总结

  • 滚动查询是建立在普通查询基础上的。
  • 滚动查询相当于快照,如果在使用scroll进行滚动查询期间有增删改的操作,那么查询结果是获取不到最新的数据的。
  • 深度分页和滚动查询优先使用滚动查询,性能更优,CPU资源耗费更少。
  • 使用完滚动查询后要记得清除滚动,以免影响下次使用。

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

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

相关文章

Sensor曝光和帧率基础知识

Sensor曝光和帧率基础知识1. 简介2. H_BLANK和V_BLANK3. 曝光原理3.1 Sensor逐行曝光基本原理3.2 Sensor全局曝光基本原理4. 曝光时间计算公式4.1 曝光一行的时间line_timeline\_timeline_time4.2 曝光一帧的时间exposure_timeexposure\_timeexposure_time4.3 帧率(fps)的计算1…

2023,“蔚小理”真的经不起更多“事故”了

历史总是惊人的相似。2013年&#xff0c;哈弗品牌独立出来&#xff0c;与长城品牌并行运营&#xff0c;当时推出两年的哈弗H6正卖得火热&#xff0c;推动SUV这个细分品类在中国快速成长&#xff0c;中国自主品牌也借SUV开始攻占被合资品牌占领的市场。时移势易。十年后的2023年…

浅析TSINGSEE车载监控平台助力城市公交智能监管的方案设计

道路运输已成为铁路以外最重要的地面运输方式&#xff0c;在国民经济和社会发展中发挥着举足轻重的作用。然而&#xff0c;随着汽车的普及和交通需求的快速增长&#xff0c;道路运输带来的交通拥堵、交通事故和环境污染等负面影响日益突出&#xff0c;逐渐成为全球经济社会发展…

Baklib支招 ——如何帮助企业创建内部维基(wiki)?

企业维基&#xff08;wiki&#xff09;的重要的好处就是&#xff1a;可以按照个性化的理解和需求进行编辑&#xff0c;而不担心被别人修改。这个个人维基可以作为自己的外挂大脑使用&#xff0c;但是不要成为一个垃圾筐&#xff0c;什么都往里装&#xff0c;扔进去就再也不看了…

计算机SCI论文重复率需要控制在多少? - 易智编译EaseEditing

SCI论文的重复率一般在20%左右&#xff0c;一般是没有没问题的。 SCI期刊在检查论文重复率时&#xff0c;并不是简单的只看总重复率&#xff0c;还有单篇重复率。 目前有很多SCI期刊都会先查重&#xff0c;看重复率&#xff0c;但也会看内容。 而且&#xff0c;重复率高也不一定…

lio-sam学习笔记(一)

前言&#xff1a; 对于lio-sam框架的安装配置。 每一回不同框架的配置真是要了老命了。。。 一、安装依赖 官方github&#xff1a; GitHub - TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping lio-sam主要有两个依赖&am…

6.深度学习和计算

6.深度学习和计算 目录 层和块 自定义块顺序块在前向传播函数中执行代码 参数管理 参数访问 目标参数一次性访问所有参数从嵌套块收集参数 参数初始化 内置初始化自定义初始化 参数绑定 自定义层 不带参数的层带参数的层 读写文件 加载和保存张量加载和保存模型参数使用GPU 计…

JS中函数声明与函数表达式的区别

1、函数定义 JavaScript 中定义函数最常用的方式是函数声明和函数表达式。这两种技术非常相似&#xff0c;有时甚至难以区分&#xff0c;它们之间还是存在着微妙的差别。 JavaScript 定义函数的最基本方式是函数声明&#xff1a; 函数声明必须独立&#xff0c;但也能够被包含在…

REST开发

REST风格一、简介优点REST风格二、使用三、注解PathVariableResponseBody、RequestParam和PathVariable区别应用快速开发一、简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 传统风格资源描述形式 http://localhost/user/ge…

Smartbi电子表格软件集成的优势

Smartbi电子表格软件作为国内顶尖的企业报表工具&#xff0c;具有“真Excel”特色&#xff0c;直接用Excel作为设计器&#xff0c;仅需安装一个插件就可以解决众多报表难题。无需增加学习成本&#xff0c;学习一个新的设计器&#xff0c;更能解决Excel的取数、性能等问题&#…

Wireless M-Bus介绍-摘自OMS

Wireless M-Bus(wM-Bus或无线M-Bus)是成熟的Wired M-Bus(有线M-Bus)标准的后续增强。2003年&#xff08;这里估计是资料错误,第一个无线M-Bus的标准是2013年的&#xff09;&#xff0c;EN 13757-4首次对其进行了描述&#xff08;&#xff1f;&#xff09;。该标准为M-Bus层模型…

Python 全栈系列216 APIFunc.Database启动流程

说明 上次做了一些改进,现在关注使用的流程。 内容 1 基础概念 能大约知道大致的几个部分有助于记忆操作步骤,以后这个项目的代号就是ABD了。 1 所有启动相关的代码全部封装在镜像apifunc_database_model1:v3,基于这个镜像就可以启动一个所有对应的服务流2 在Portal上有相关…

为WEB3 的GameFi行业爆发提供全新动力

WEB3 GameFi的突破口在2022年末Octopus Network Co-founder Louis指出&#xff0c;GameFi要完成2023年的全新爆发需要将所有权与经营权分离&#xff0c;所有用户共同参与由平台成长带来的市场红利&#xff0c;单一的Gamefi将会更加产品化&#xff0c;体验化&#xff0c;具备整合…

详解树状数组

前言树状数组或二叉索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题&#xff0c;现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 O(…

JVM线上问题定位命令

概述 本文主要介绍下平常可能会使用到的命令&#xff1a;jps、jinfo、jmap、jstat、jstack jps jps主要是查看Java进程号&#xff0c;有个Java进程号后面的命令也才能发挥作用。 jps -help可以列出jps支持的参数&#xff0c;大家可以试一下 jinfo jinfo后面跟jps打出来的…

nvm(node版本管理)

文章目录1 安装2 配置镜像&#xff0c;提高下载速度3 常用命令4 vue版本与node版本的依赖关系注意事项1 nvm use 报错1 安装 官方下载地址&#xff1a; https://nvm.uihtm.com/ 官网同时还给出了非常详细的指令文档。 下载windows版本的安装包&#xff0c;按照提示点击下一步…

网络通信Socket学习记录

网络通信Socket Socket socket起源于unix&#xff0c;而unix/linux基本思想就是一切皆文件&#xff0c;也称为文件描述符socket是对“open—write/read—close”的一种实现socket是对TCP/IP协议的一种封装&#xff0c;socket本身不是协议&#xff0c;通过socket才能使用TCP/I…

一站式轻监控轻运维系统nezha(上篇)

本文软件由网友 114514 推荐&#xff1b; 什么是哪吒监控 &#xff1f; 哪吒监控 是自托管、轻量级服务器和网站监控运维工具&#xff0c;属于一站式轻监控轻运维系统&#xff0c;分主控端和被控端&#xff0c;主控端提供访问的面板&#xff0c;被控端就是需要监控的服务器。 准…

Python的集合(set)类型、None类型.....

Day07 数据类型&#xff08;下&#xff09; dict,字典类型,一个容器&#xff0c;元素必须是键值对 Set,集合类型&#xff0c;一个不允许重复&可变类型&#xff08;元素可哈希&#xff09; float&#xff0c;浮点类型&#xff0c;常见的小数 文章目录1.集合&#xff08;se…

this和super的区别

0.定义区别this&#xff1a;是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。 super&#xff1a;可以理解为是指向自己超&#xff08;父&#xff09;类对象的一个指针&#xff0c;而这个超类指的是离自己最 近的一个父类。…