Elasticsearch滚动查询

当我们在构造条件进行查询时,如果符合你的构造条件的数据量非常庞大,你就会发现response.getHits().getTotalHits()的值只是10000。那么如何解决这个问题?这时就可以使用elasticsearch中的scroll(滚动查询)

什么是滚动查询 ?

滚动查询和原生查询,一个相当于我们翻书,可以跳,一个相当于长图,看到哪儿显示哪儿,这也是他们的异同点:滚动查询无论查多少数据都可以,但是不能翻页,不支持分页,普通查询,支持翻页分页,但是只支持一万笔以内的数据量

如果直接使用 Java Client,可以参考官方 API 文档:

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-search-scroll.html

滚动查询使用

直接上代码:


@SpringBootTest
@Slf4j
class SpringbootElasticsearchApplicationTests {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    final Scroll scroll = new Scroll(TimeValue.timeValueMillis(100L));  //设置滚动查询时间
    
    //构建查询请求
    SearchRequest searchRequest = new SearchRequest().indices("t_shirt");

    @Test
    public void scrollTest1() throws IOException {
        searchRequest.scroll(scroll);
        BoolQueryBuilder must = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("color", "red"));
        searchRequest.source(new SearchSourceBuilder().query(must).size(2));
        //第一次查询结果 (前10000条数据)
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("首次查询数量====》"+ searchResponse.getHits().getHits().length);
        //获取滚动查询id
        String scrollId = searchResponse.getScrollId();
        //查询结果
        SearchHit[] hits = searchResponse.getHits().getHits();
        //进行滚动查询
        while (hits != null && hits.length > 0){
            //创建滚动查询请求
            SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
            //每次滚动查询时间
            searchScrollRequest.scroll(scroll);
            //执行滚动查询,更新响应结果
            searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
            //更新scrollId
            scrollId = searchResponse.getScrollId();
            //处理返回搜索结果
           hits = searchResponse.getHits().getHits();
            System.out.println("滚动查询数量====》"+hits.length);
            //TODO 结果处理
        }

        //完成滚动查询后清除滚动上下文
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
        boolean succeeded = clearScrollResponse.isSucceeded();
        System.out.println("是否清除=====》"+succeeded);
    }
  }

注意:

  • searchRequest.source(new SearchSourceBuilder().query(must).size(2)); 设置每次滚动查询的数量
  • 可以看出来,滚动查询也很简单,普通查询只能查一万笔,滚动查询就是从第一万零一笔数据开始,进行滚动,后续一直滚动,直到没有,所以滚动查询出来的结果逻辑处理,和上边普通查询是一样的,另外,滚动查询是建立在普通查询基础上的!!!

以上就是ES的滚动查询,可以解决普通查询只能查询一万笔的限制。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_子栖_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值