es 7.3 Java API 解决数据只显示10000+问题

最近在用es做统计的时候,有个同比和环比的需求,但是数据量超过10000的时候只能显示10000+,如下:


image.png

经过在网上冲浪之后找到了解决办法,一行代码搞定!

searchSourceBuilder.trackTotalHits(true);

官网解释是这样的:


image.png

elasticsearch 分页查询全部数据只显示10000条问题

当索引非常非常大(千万或亿),是无法安装 from + size 做深分页的,分页越深则越容易OOM,即便不OOM,也是很消耗CPU和内存资源的。官方在后2.x版本中已增加限定 index.max_result_window:10000作为保护措施 ,即默认 from + size 不能超过1万。

所以数据量大的话,采用scroll游标查询。

        final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L)); //设定滚动时间间隔
        searchRequest.scroll(scroll);
        searchSourceBuilder.size(1000); //设定每次返回多少条数据

        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        String scrollId = searchResponse.getScrollId();
        List<Map<String, Object>> mapList = new ArrayList<>();
        boolean flag;
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        for (SearchHit searchHit : searchHits) {
                mapList.add(searchHit.getSourceAsMap());
            }
        }

        //遍历搜索命中的数据,直到没有数据
        while (searchHits != null && searchHits.length > 0) {
            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(scroll);
            try {
                searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            scrollId = searchResponse.getScrollId();
            searchHits = searchResponse.getHits().getHits();
            if (searchHits != null && searchHits.length > 0) {
                for (SearchHit searchHit : searchHits) {
                        mapList.add(searchHit.getSourceAsMap());
                    }
                }
            }
        }
        //清除滚屏
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);//也可以选择setScrollIds()将多个scrollId一起使用
        ClearScrollResponse clearScrollResponse = null;
        try {
            clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        boolean succeeded = clearScrollResponse.isSucceeded();
        System.out.println("succeeded:" + succeeded);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 有些人,似荷,只能远看,有些人,如风,不必在意,有些人,似茶,可以细品,有些人,如树,可以一生依靠,路过的已经...
    思凡的鱼阅读 206评论 0 0
  • 月光穿过窗帘的缝隙洒落在丁丁的小床上。这柔和温润的白月光轻抚着熟睡中的孩子,好像有一个带翅膀的仙女挥动手中...
    猫爪丁丁阅读 199评论 0 0
  • JavaScript 日期(Date) Date对象用于处理日期和时间。使用对象new Date()创建日期。实例...
    web全栈阅读 236评论 0 0
  • 一场夏雨打破了闷热, 鱼儿也浮上水面呼吸。 夜幕即将降临雨来了, 又是一夜有雨的夏日。 雨夜,深夜,无人, 伫立,...
    五月洛梅阅读 273评论 0 2

友情链接更多精彩内容