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);
}