es深度查询实战

1024,废话不多说,直接上代码!!!

public R<GoldNetPage<ReceiptCheckInfoVo>> receiptChecks(CommonQueryParam param) {
        GoldNetUser user = AuthUtil.getUser();
        if (Objects.isNull(user)) {
            return R.fail("用户信息为空");
        }
        List<Map<String, Object>> params = param.getParam();
        String purchaserId = StrategyUtil.getNameValue(param.getParam(), "purchaserId");
        if (param.getParam() != null) {
            for (Map<String, Object> data : param.getParam()) {
                if (Func.isEmpty(data.get("name")) || Func.isEmpty(data.get("value")) || Func.isEmpty(data.get("nameType"))) {
                    continue;
                }
                String fieldName = data.get("name").toString();
                if ("purchaserId".equals(fieldName)) {
                    data.put("value", null);
                }
            }
        }

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(1000);
        sourceBuilder.trackTotalHits(true);
        // 创建滚动分页查询请求
        // 1、创建searchRequest
        SearchRequest searchRequest = new SearchRequest(ES_RECEIPT_INDEX);
        // 2、指定scroll信息
        searchRequest.scroll(TimeValue.timeValueMinutes(1L));
        BoolQueryBuilder queryBuilder = commonService.queryBuilder(params, user);
        queryBuilder.must(QueryBuilders.termQuery("supplierCode.keyword", user.getEnterpriseId()));
        queryBuilder.must(QueryBuilders.termQuery("enterpriseId.keyword", purchaserId));
        // 加载查询条件
        sourceBuilder.query(queryBuilder);
        sourceBuilder.sort("createTime", SortOrder.DESC);
        searchRequest.source(sourceBuilder);
        log.info("receipt checks queryBuilder is:{}", JSONObject.toJSONString(queryBuilder));
        //4、获取返回结果scrollId,source
        SearchResponse response = null;
        try {
            response = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.warn("验收异议单条件查询索引{}时出错", ES_RECEIPT_INDEX);
            log.warn("验收异议单条件查询索引出错:", e);
        }
        SearchHit[] hits = response.getHits().getHits();
        RestStatus status = response.status();
        if (status.getStatus() != 200) {
            log.info("验收异议单查询失败");
            return R.fail("验收异议单查询失败");
        }
        String scrollId = response.getScrollId();
        List<Map<String, Object>> sourceList = new ArrayList<>();
        for (SearchHit hit : hits) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            sourceList.add(sourceAsMap);
        }
        log.info("receipt checks sourceList size is:{}", sourceList.size());
        while (true) {
            //5、循环  -  创建 SearchScrollRequest  创建一个新的搜索滚动请求,保存最后返回的滚动标识符和滚动间隔
            // 获取 scrollId 去查询下一页
            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            //6、指定scrollId的生存时间
            scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
            //7、执行查询获取返回结果
            SearchResponse scrollResp = null;
            try {
                scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //8、判断是否查询到了数据,输出
            SearchHit[] searchHits = scrollResp.getHits().getHits();
            //循环输出下一页
            if (searchHits != null && searchHits.length > 0) {
                for (SearchHit hit : searchHits) {
                    sourceList.add(hit.getSourceAsMap());
                }
            } else {
                //9、判断没有查询到数据,退出循环
                break;
            }
        }
        //查完之后我们把存进缓存的id给删除  完成滚动后,清除滚动上下文
        //10、创建ClearScrollRequest
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        //11、指定scrollId
        clearScrollRequest.addScrollId(scrollId);
        //12、删除scrollId
        ClearScrollResponse clearScrollResponse = null;
        try {
            clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.error("删除scroll异常:", e);
            throw new RuntimeException(e);
        }
        //13、输出结果
        boolean succeeded = clearScrollResponse.isSucceeded();
        log.info("删除scrollId:{}", succeeded);
        log.info("查询总个数:{}", sourceList.size());
        List<Map<String, Object>> retMapList = new ArrayList<>();
        // 没有 receiptDetails 不需要展示,因为不知道它的CheckStatus,此处只取CheckStatus=3的数据
        List<Map<String, Object>> receiptDetailsMapList = new ArrayList<>();
        for (Map<String, Object> map : sourceList) {
            if (Func.isEmpty(map.get("receiptDetails"))) {
                continue;
            }
            receiptDetailsMapList.add(map);
        }
        for (Map<String, Object> map : receiptDetailsMapList) {
            List<Map<String, Object>> recepitList = (List<Map<String, Object>>) map.get("receiptDetails");
            for (Map<String, Object> receipt : recepitList) {
                if (!"3".equals(Func.toStr(receipt.get("checkStatus")))) {
                    continue;
                }
                Set<String> receiptMapKeys = receipt.keySet();
                for (String receiptMapKey : receiptMapKeys) {
                    if (Func.isEmpty(map.get(receiptMapKey))) {
                        // source中添加receiptDetails有但是source中没有的key以及value
                        map.put(receiptMapKey, receipt.get(receiptMapKey));
                    }
                }
                retMapList.add(map);
            }
        }
        log.info("receipt checks retMapList size is:{}",retMapList.size());
        List<Map<String, Object>> sortList = retMapList.stream().sorted((a, b) -> {
            Long al = Func.toLong(Func.isNotEmpty(a.get("createTime")) ? a.get("createTime") : 0L);
            Long bl = Func.toLong(Func.isNotEmpty(b.get("createTime")) ? b.get("createTime") : 0L);
            return bl.compareTo(al);
        }).collect(Collectors.toList());

        GoldNetPage result = new GoldNetPage<>();
        int current = param.getCurrent();
        int size = param.getSize();
        result.setCurrent(current);
        result.setSize(size);
        result.setTotal(sortList.size());
        result.setRecords(sortList);
        if (Func.isNotEmpty(sortList)) {
            int pageFrom = (current - 1) * size;
            int pageTo = current * size;
            if (pageTo > retMapList.size()) {
                result.setRecords(sortList.subList(pageFrom, sortList.size()));
            } else {
                result.setRecords(sortList.subList(pageFrom, pageTo));
            }
        }
        return R.data(result);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乐观的Terry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值