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的滚动查询,可以解决普通查询只能查询一万笔的限制。

你可能感兴趣的:(数据库,elasticsearch,java)