• ES使用游标查询数据


    1. // 统计查询
    2. CountRequest countRequest = new CountRequest();
    3. countRequest.types("类型,按照版本进行使用");
    4. countRequest.indices("索引");
    5. // 构建查询参数
    6. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    7. // 设置统计查询参数
    8. countRequest.source(searchSourceBuilder);
    9. // 统计数量
    10. CountResponse countResponse = restHighLevelClient.count(countRequest,RequestOptions.DEFAULT);
    11. // 获取数量
    12. long count = countResponse.getCount();
    13. if(count > 500000){
    14. throw new RumtimeException("下载数量不允许超过50W");
    15. }
    16. // 数量大于1W条时使用scroll进行下载数据
    17. if (count > 10000) {
    18. searchSourceBuilder.size(10000);
    19. SearchRequest searchRequest = new SearchRequest("索引").types("类型,按版本判断是否使用");
    20. searchRequest.source(searchSourceBuilder);
    21. // 创建游标并设置过期时间
    22. Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L));
    23. // 设定游标
    24. searchRequest.scroll(scroll);
    25. // 执行查询,获取响应数据和游标ID
    26. SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    27. String scrollId = searchResponse.getScrollId();
    28. SearchHit[] searchHits = searchResponse.getHits().getHits();
    29. // 收集数据集合
    30. List searchHitList = new ArrayList<>(Arrays.asList(searchHits));
    31. while (true) {
    32. if (searchHits.length == 0) {
    33. break;
    34. }
    35. // 创建游标查询请求
    36. SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
    37. // 设定游标时长
    38. scrollRequest.scroll(scroll);
    39. // 使用游标进行查询
    40. searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
    41. // 获取游标ID
    42. scrollId = searchResponse.getScrollId();
    43. // 获取数据
    44. searchHits = searchResponse.getHits().getHits();
    45. searchHitList.addAll(Arrays.asList(searchHits));
    46. }
    47. // 清除游标ID
    48. ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
    49. clearScrollRequest.addScrollId(scrollId);
    50. restHighLevelClient.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
    51. // TODO process 处理逻辑
    52. return;
    53. }

  • 相关阅读:
    04_服务注册Eureka
    C++.I/O流
    计算机毕业设计Java重工教师职称管理系统(源码+系统+mysql数据库+lw文档)
    【Python数据科学 | 11】应用实战:我的第一个开源项目-基金定投回测工具
    那么多优秀的自动化测试工具,而你只知道Selenium?
    面试八股文之·TCP协议
    SpringBoot:Web开发之Filter实践
    Pytest 自定义HOOK函数
    基于FPGA的FIR滤波器的设计与实现
    移动Web第四天 1 移动适配
  • 原文地址:https://blog.csdn.net/now19930616/article/details/134526700