Java REST Client 查询ElasticSearch示例

cardinality去重

AggregationBuilder aggregation = AggregationBuilders.cardinality("identityno_count").field("IdentityNo.keyword").precisionThreshold(40000);//去重,默认3000,最大可设置40000,如果结果超过这个值会有5%的误差

MultiSearchRequest执行多个搜索请求

以下示例为搜索前7天,每天的数据量去重后的结果,只为表现 MultiSearchRequest的使用;实际如有上述需求可用dateHistogram实现

// An highlighted block
RestHighLevelClient client = EsClientManager.getRestHighLevelClient();
MultiSearchRequest searchRequest = new MultiSearchRequest();//创建MultiSearchRequest
Date end = new Date();
Date current = DateUtils.addDays(end , -6);
while (current.before(end)) {
            Date start = DateUtils.addDays(current, -1);
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.size(0);
            BoolQueryBuilder boolBuilder = boolQuery();
            boolBuilder.must(termQuery("FlowId.keyword", jsonObject.get("flowId")))
                    .must(termQuery("Call_Type.keyword", "授信"));
                    
            boolBuilder.must(rangeQuery("CreateTime").format("yyyy-MM-dd HH:mm:ss").gte(DateUtil.getDateFormatString(start, "yyyy-MM-dd HH:mm:ss")).lt(DateUtil.getDateFormatString(current, "yyyy-MM-dd HH:mm:ss")));

            AggregationBuilder aggregation = AggregationBuilders.cardinality("identityno_count").field("IdentityNo.keyword").precisionThreshold(40000);
            sourceBuilder.query(boolBuilder);
            sourceBuilder.aggregation(aggregation);
            SearchRequest searchRequestItem = new SearchRequest();
            searchRequestItem.source(sourceBuilder);
            searchRequest.add(searchRequestItem);
            current = DateUtils.addDays(current, 1);
        }
        if (searchRequest.requests() != null && searchRequest.requests().size() > 0) {
            MultiSearchResponse response = client.multiSearch(searchRequest);
                for (int i = 0; i < res.size(); i++) {
                    ParsedCardinality count = (ParsedCardinality) response.getResponses()[i].getResponse().getAggregations().asMap().get("identityno_count");
                    int countValue = (int) count.getValue();
                    res.get(i).setBeforePassCount(countValue);
                }
        }

dateHistogram按时间分组查询

		String pattern = "yyyy-MM-dd HH:mm:ss";
        String sdate = DateUtil.getDateFormatString(request.getStarTime(), pattern);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(0);
        BoolQueryBuilder boolBuilder = boolQuery();
        boolBuilder.must(termQuery("FlowId.keyword", jsonObject.get("flowId")))
                .must(termQuery("Call_Type.keyword", "授信"));
                boolBuilder.must(rangeQuery("CreateTime").format(pattern).gte(sdate).lt(DateUtil.getDateFormatString(DateUtils.addDays(request.getEndTime(), 1), "yyyy-MM-dd HH:mm:ss")));
        AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("agg_time").format(pattern).field("CreateTime").dateHistogramInterval(DateHistogramInterval.days(1));
        AggregationBuilder aggregation = AggregationBuilders.cardinality("identityno_count").field("IdentityNo.keyword").precisionThreshold(40000);
        aggregationBuilder.subAggregation(aggregation);
        sourceBuilder.query(boolBuilder);
        sourceBuilder.aggregation(aggregationBuilder);
        SearchRequest searchRequest = new SearchRequest(jsonObject.get("index").toString())
                .types(jsonObject.get("type").toString()).source(sourceBuilder);
        SearchResponse response = client.search(searchRequest);
        Histogram agg = response.getAggregations().get("agg_time");
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        for (Histogram.Bucket entry : agg.getBuckets()) {
            ParsedCardinality count = (ParsedCardinality) entry.getAggregations().asMap().get("identityno_count");
            int countValue = (int) count.getValue();
          	CreditOverstockDTO item = new CreditOverstockDTO();
            item.setBeforePassCount(countValue);
            item.setCreateTime(sdf.parse(entry.getKeyAsString()));
            res.add(item);
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值