elasticsearch 大数据场景下使用scroll实现分页查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Justnow_/article/details/80257180

es查询大批量数据的”可能方案”

当使用es来请求大批量数据时,通常有三种办法,其一:直接查询获取全量数据;其二:使用setFrom以及setSize解决;其三:使用es自带的scroll分页支持

方案评估


对于上述方案的评估,此处建议大家可以先看看这篇文章 Elasticsearch 搜索内部执行原理

方案选择


经上述评估,显然,最终采取scroll进行分页实现,分页后的数据处理有两种方式可供处理。第一种,获取分页后的数据再聚合;第二种,直接处理分页后的数据。对于第一种,如若聚合后的数据有几十万、上百万,乃至更多,那势必会导致系统内存飙升,jvm老年代可能会被迅速打满,进而促发full gc, 若full gc后仍得不到可用空间,可能会造成oom,服务直接不可用。所以第一种处理方式是存在风险的,推荐使用第二种

核心代码


假定各位maven已配置好,es处于可用状态
使用scroll分页主要分为2步,第1步,初始化查询,获取scrollId。第2步使用scrollId迭代查询

  • 初始化查询
    //构建查询条件(非必须)
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(QueryBuilders.matchQuery("rate_object","item"));
        RangeQueryBuilder publishDateBuilder = QueryBuilders.rangeQuery("created_at");

        publishDateBuilder.from("2018-04-22 00:00:00");//格式需要同你创建索引时的格式匹配
        boolQueryBuilder.filter(publishDateBuilder);



        TransportClient client = factory.getClient();
        SearchResponse response = client.prepareSearch("index")//对应索引
                .setTypes("type")//对应索引type
                .setQuery(boolQueryBuilder)
                .setScroll(TimeValue.timeValueMinutes(10))
                .setSize(100)
                .execute()
                .actionGet();
  • 迭代查询
//此处实现迭代的方式较多,仅列其一,
while (response.getHits().getHits().length>0) {
            String scrollId = response.getScrollId();
            response = client.prepareSearchScroll(scrollId)
                    .setScroll(TimeValue.timeValueMinutes(10))//设置查询context的存活时间
                    .execute()
                    .actionGet();

            SearchHits hits = response.getHits();
            for (SearchHit hit:hits.getHits()) {
                String hitString = hit.getSourceAsString();
                System.out.println(hitString);//此处可进行业务逻辑
            }         
        }

注:处理结束后,记得clean scroll

ClearScrollRequest request = new ClearScrollRequest();
        request.addScrollId(response.getScrollId());
        client.clearScroll(request);

留下此篇博客以供自己日后参考

猜你喜欢

转载自blog.csdn.net/Justnow_/article/details/80257180