复制代码

为懒人提供无限可能,生命不息,code不止

人类感性的情绪,让我们知难行难
我思故我在
日拱一卒,功不唐捐
  • 首页
  • 前端
  • 后台
  • 数据库
  • 运维
  • 资源下载
  • 实用工具
  • 接口文档工具
  • 登录
  • 注册

elasticsearch高级客户端

【原创】elasticsearch search_after 高级客户端 数据滚动全量搜索

作者: whooyun发表于: 2023-09-21 15:25

    @Override
    public List<ESAdsSaleGdsOrgAmtNd> querySaleOrgGdsNoLimit(SingleAnalysisConditionDto condition, CommonPageDto page) {
        List<ESAdsSaleGdsOrgAmtNd> resultList = new ArrayList<>();
        // 替换为您的索引名称
        String indexName = "ads_sale_gds_org_amt_nd";

        // 每页的文档数
        int pageSize = 1000;
        // 上一页的排序字段值
        Object[] lastSortValues = null;
        try {
            while (true) {
                // 创建搜索请求
                SearchRequest searchRequest = new SearchRequest(indexName);
                SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
                String[] include = {"own_org_id", "sku_id"};
                searchSourceBuilder.fetchSource(include, null);
                // 构建查询
                // 使用 constant_score 查询,忽略 _score
                searchSourceBuilder.query(QueryBuilders.constantScoreQuery(this.createQueryBuilder(condition, null)));

                searchRequest.source(searchSourceBuilder);
                // 设置分页参数
                searchSourceBuilder.size(pageSize);

                // 使用search_after来设置上一页的排序字段值
                if (lastSortValues != null) {
                    searchSourceBuilder.searchAfter(lastSortValues);
                }
                // 创建排序规则
                // 设置排序字段和排序方式
                searchSourceBuilder.sort(new FieldSortBuilder("day_cnt").order(SortOrder.ASC));
                searchSourceBuilder.sort(new FieldSortBuilder("sku_id").order(SortOrder.ASC));
                searchSourceBuilder.sort(new FieldSortBuilder("stat_dtm").order(SortOrder.ASC));
                searchRequest.source(searchSourceBuilder);
                // 执行查询
                SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

                // 处理查询结果
                SearchHits hits = searchResponse.getHits();
                for (SearchHit hit : searchResponse.getHits().getHits()) {
                    // 获取文档的数据
                    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                    // 使用json将sourceAsMap转换为ESAdsSaleGdsOrgAmtNd对象
                    ESAdsSaleGdsOrgAmtNd gds = JSON.parseObject(JSON.toJSONString(sourceAsMap), ESAdsSaleGdsOrgAmtNd.class);
                    resultList.add(gds);
                }
                SearchHit[] sortHits = searchResponse.getHits().getHits();
                // 获取上一页的排序字段值,用于下一页查询
                if (sortHits.length > 0) {
                    lastSortValues = sortHits[sortHits.length - 1].getSortValues();
                } else {
                    // 如果没有更多数据,退出循环
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultList;
    }