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

这篇具有很好参考价值的文章主要介绍了ElasticSearch6.x版本的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大小获取数据(前提是在设置的过期时间之内)。spring-data-elasticsearch 滚动查询,开发记录,spring boot,elasticsearch,java那问题来了,我们该如何使用这个_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.然后写单元测试代码,实现滚动查询。文章来源地址https://www.toymoban.com/news/detail-796788.html

@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资源耗费更少。
  • 使用完滚动查询后要记得清除滚动,以免影响下次使用。

到了这里,关于ElasticSearch6.x版本的Scroll滚动查询讲解及Kibana和SpringBoot实操演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch6.x版本概念介绍以及在Kibana上增删改查的操作

    教学讲解视频地址:视频地址 1.接近实时(NRT Near Real Time ) Elasticsearch是一个 接近实时 的搜索平台。这意味着, 从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒内) 2.索引(index) 一个索引就是一个拥有几分相似特征的文档的集合 。比如说,你可以有一个

    2023年04月24日
    浏览(44)
  • Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search

    基于scroll滚动技术实现大数据量搜索 如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。 scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜

    2024年02月14日
    浏览(53)
  • java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。

    (1)首先我们要明白es的查询机制:ES的搜索是分2个阶段进行的,即 Query阶段和Fetch阶段 。 Query阶段 比较轻量级,通过查询倒排索引,获取满足查询结果的文档ID列表。 Fetch阶段 比较重,需要将每个分片的查询结果取回,在协调结点进行 全局 排序。 通过From+size这种方式分批

    2024年02月03日
    浏览(84)
  • ElasticSearch7.3学习(二十二)----Text字段排序、Scroll分批查询场景解析

    场景:数据库中按照某个字段排序,sql只需写order by 字段名即可,如果es对一个 text field 进行排序,es中无法排序。因为文档入倒排索引表时,分词存入,es无法知道此字段的真实值。这样的结果往往不准确,因为分词后是多个单词,再排序就不是我们想要的结果了。 通常有两

    2024年02月08日
    浏览(43)
  • Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询

    ES在进行普通的查询时,默认只会查询出来10条数据。我们通过设置es中的size可以将最终的查询结果从10增加到10000。如果需要查询数据量大于es的翻页限制或者需要将es的数据进行导出又当如何? Elasticsearch提供了一种称为 \\\"滚动查询\\\"(Scrolling) 的机制,用于处理大型数据集的

    2024年02月11日
    浏览(46)
  • ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

    我的Git地址:https://gitee.com/ITLULU 欢迎访问 ES的分页查询和关系数据库的分页查询的区别: ES分页查询有以下几种: 1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力) 2: scroll基于查询窗口

    2024年02月01日
    浏览(53)
  • elasticsearch6.8.6安装配置

     参考文章: elasticsearch安装配置_qianhuan_的博客-CSDN博客_elasticsearch安装配置 CentOS7.3安装elasticsearch6.8.6 - 简书 java1.8+ 下载地址: 解压elasticsearch-6.8.6.tar.gz tar -zxvf elasticsearch-6.8.6.tar.gz 启动es必须创建用户,不能使用root启动 useradd esuser 分配权限 chown -R esuser elasticsearch-6.8.6(安装

    2024年02月10日
    浏览(45)
  • elasticsearch6.6.0设置访问密码

    首先破解 x-pack-core-6.6.0.jar 破解的方式大家可以参考 https://codeantenna.com/a/YDks83ZHjd 中5.破解x-pack 这部分 , 也可以直接下载我编译好的 https://download.csdn.net/download/iBuDongIt/88748782 下载后解压替换 elasticsearch-6.6.0/modules/x-pack-core/x-pack-core-6.6.0.jar即可 注意 : 先切换到 elasticsearch 所属的

    2024年01月17日
    浏览(38)
  • elasticsearch7与elasticsearch6配置的一点差异

    Elasticsearch 的核心是集群协调子系统。Elasticsearch 7 提供了一个新的集群协调子系  统,Elasticsearch 6.x 及之前的版本使用了一个叫作 Zen Discovery 的集群协调子系统,从 7.0 开始,如果你想要启动一个全新的集群,并且集群在多台主机上都有节点,那么你必须指定该集群在第一次

    2024年02月11日
    浏览(44)
  • 【ES实战】Elasticsearch6开始的CCR

    本文涉及官网文章地址 Overview Requirements for leader indices Automatically following indices Getting started with cross-cluster replication Upgrading clusters 跨集群复制 (CCR) 功能可以将远程集群中的索引复制到本地集群。 此功能可用于一些常见的生产用例: 主集群发生故障时的灾难恢复。 辅助集群可

    2024年01月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包