java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。

这篇具有很好参考价值的文章主要介绍了java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。

一、为什么要使用ES的scroll

(1)首先我们要明白es的查询机制:ES的搜索是分2个阶段进行的,即Query阶段和Fetch阶段

  • Query阶段比较轻量级,通过查询倒排索引,获取满足查询结果的文档ID列表。

  • Fetch阶段比较重,需要将每个分片的查询结果取回,在协调结点进行全局排序。 通过From+size这种方式分批获取数据的时候,随着from加大,需要全局排序并丢弃的结果数量随之上升,性能越来越差。

(2)es在进行普通的查询时,默认只给查询出来十条数据。

​ 通过设置size的值可以使查询结果从10增大到1000条数据,当超出1000条数据的时候就会只显示出来1000条数据。

​ 为了解决上面的问题可以采用一种效率比较低的方法,在创建索引的时候添加如下配置

  • 
    "settings":{
    		"index":{
    			"max_result_window": 在这里填入你需要的大小				}
    			}
    

(3)如果进行高效的查询呢?那就需要使scroll滚动查询了。

Scroll查询,先做轻量级的Query阶段以后,免去了繁重的全局排序过程。 它只是将查询结果集,也就是doc_id列表保留在一个上下文里, 之后每次分批取回的时候,只需根据设置的size,在每个分片内部按照一定顺序(默认doc_id续), 取回size数量大小的数据即可。

二、如何使用scroll

(1)首先引入elasticsearch的坐标

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

(2)编写如下代码文章来源地址https://www.toymoban.com/news/detail-436834.html


    /**
     * 使用es的scroll方法来滚动查询es的数据,可以有效的解决大数据容量读取的限制
     * @param index  es的索引名称
     * @param host   es的主机ip号
     * @param port   es的端口号
     * @param beginDate   构造查询条件需要的条件之一 (可以根据自己需求定义es的查询条件)
     * @param endDate     构造查询条件需要的条件之一 (可以根据自己需求定义es的查询条件)
     */
    public void scrollDemo(String index,String host,int port,String beginDate,String  endDate) throws ParseException {
        RestHighLevelClient restHighLevelClient=new RestHighLevelClient(RestClient.builder(new HttpHost(host,port,"http")));
        //构造查询条件
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //设置查询超时时间
        Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L));
        builder.query(QueryBuilders.rangeQuery("datetime").gte(beginDate).lte(endDate));
        //设置最多一次能够取出1000笔数据,从第1001笔数据开始,将开启滚动查询  
        //PS:滚动查询也属于这一次查询,只不过因为一次查不完,分多次查
        builder.size(1000);
        searchRequest.source(builder);
        //将滚动放入
        searchRequest.scroll(scroll);
        SearchResponse searchResponse = null;
        try {
            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            System.out.println("查询索引库失败");
        }
        SearchHits hits= searchResponse.getHits();
        SearchHit[] hit= hits.getHits();
        /**
        *在这个位置已经读到了前一千条数据,可以在这先对这一千数据进行处理。下面滚动查询剩下的数据
        */
        //记录要滚动的ID
        String scrollId = searchResponse.getScrollId();
        //滚动查询部分,将从第1001笔数据开始取
        SearchHit[] hitsScroll = hits.getHits();
        while (hitsScroll != null && hitsScroll.length > 0 ) {
            //构造滚动查询条件
            SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
            searchScrollRequest.scroll(scroll);
            try {
                //响应必须是上面的响应对象,需要对上一层进行覆盖
                searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                System.out.println("滚动查询失败");
            }
            scrollId = searchResponse.getScrollId();
            hits = searchResponse.getHits();
            hitsScroll = hits.getHits();
            /**
            *在这个位置可以对滚动查询到的从1001条数据开始的数据进行处理。
            */
        }
        //清除滚动,否则影响下次查询
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        ClearScrollResponse clearScrollResponse = null;
        try {
            clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            System.out.println("滚动查询删除失败");
        }
        //清除滚动是否成功
        boolean succeeded = clearScrollResponse.isSucceeded();
    }

到了这里,关于java使用ElasticSearch的scroll查询,高效的解决es查询数量的限制。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(49)
  • ElasticSearch进阶:多种查询操作,各种ES查询以及在Java中的实现

    目录 前言 1 词条查询 1.1 等值查询-term 1.2 多值查询-terms 1.3 范围查询-range 1.4 前缀查询-prefix 1.5 通配符查询-wildcard 2 复合查询 2.1 布尔查询 2.2 Filter查询 3 聚合查询 3.1 最值、平均值、求和 3.2 去重查询 3.3 分组聚合 3.3.1 单条件分组 3.3.2 多条件分组 3.4 过滤聚合 ElasticSearch 第一篇

    2024年02月02日
    浏览(40)
  • 关于SpringBoot集成ES Scroll API(滚动查询)的实践

    那是年初在某个交付项目,从用户侧获知了一个elastic search作为分布式数据库的一个瓶颈,那就是单次查询量超过了ES的默认单次查询上限10000。 在大部分业务下,为了执行ES的数据查询,开发者往往都直接使用了query某个条件获取数据,这些条件对应的数据大多都不会超过1

    2024年01月23日
    浏览(27)
  • elasticSearch大量数据查询导出报错解决es

    elasticsearch的client包下的HeapBufferedAsyncResponseConsumer类中传入了bufferLimit,该值 org.apache.http.nio.protocol.HttpAsyncResponseConsumer 的默认实现。在堆内存中缓冲整个响应内容,这意味着缓冲区的大小等于响应的内容长度。根据可配置的参数限制可以读取的响应的大小。如果实体长于配置

    2023年04月16日
    浏览(33)
  • Elasticsearch Search Scroll API(滚动查询)

    参考:Elasticsearch Search Scroll API(滚动查询) - 简书 Elasticsearch 中,传统的分页查询使用 from+size 的模式, from 就是页码,从 0 开始。默认情况下,当 (from+1)*size 大于 10000 时,也就是已查询的总数据量大于 10000 时,会出现异常。 如下,用循环模拟一个连续分页查询: 最终当

    2023年04月20日
    浏览(35)
  • 【ElasticSearch】ES自动补全查询与Java接口实现

    自动补全就是当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项。 要实现根据字母做补全,就必须对文档按照拼音分词。GitHub上有相关插件,地址:https://github.com/medcl/elasticsearch-analysis-pinyin,下载和ES对应的版本。 安装步骤: 解压 上传到虚拟机中,elasti

    2024年02月15日
    浏览(31)
  • ElasticSearch 10000条查询数量限制

    我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错,这是因为ES通过index.max_result_window这个参数控制能够获取数据总数from+size最大值,默认限制是10000条,因为ES考虑到数据要从其它节点上报到协调节点如果搜索请求的数据越多,会导致ES协调节点占用的堆内

    2024年02月06日
    浏览(29)
  • Elasticsearch 查询和聚合查询:基本语法和统计数量

    摘要:Elasticsearch是一个强大的分布式搜索和分析引擎,提供了丰富的查询和聚合功能。本文将介绍Elasticsearch的基本查询语法,包括预发查询和聚合查询,以及如何使用聚合功能统计数量。 Elasticsearch是一种开源的分布式搜索和分析引擎,广泛应用于各种场景,包括日志分析、

    2024年02月11日
    浏览(37)
  • ElasticSearch进阶:一文全览各种ES查询在Java中的实现

    ElasticSearch进阶:一文全览各种ES查询在Java中的实现 es基本语句详解 查询语句详解 ElasticSearch第一篇: ElasticSearch基础:从倒排索引说起,快速认知ES 完整项目已上传至:ElasticSearch Demo 项目,该项目是关于springboot的集成项目,ElasticSearch部分请关注【elasticSearch-demo】模块。觉得

    2024年02月02日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包