一、应用场景:获取一天的交易总笔数、成功笔数、失败笔数
二、Rest API实现方式:
GET /ms_online/_search
{
"size":0,
"query": {
"bool":{
"must": [
{
"range": {
"@timestamp": {
"gte": "2017-02-16",
"lte": "2017-02-16"
}
}
}
]
}
},
"aggs": {
"sum_data": {
"date_histogram": {
"field": "@timestamp",
"interval": "day"
}
},
"group_count":{
"terms": {
"field": "suc_flag.keyword",
"min_doc_count": 0
}
}
}
}
二、Java API实现方式:
/**
* 获取汇总预览信息 交易总笔数、交易成功笔数、交易失败笔数
* @param param
* @return
*/
public TradesMonitorVO getSumData(TradesMonitorVO param){
SearchRequestBuilder requestbuilder = client.prepareSearch(param.getIndex());
//不需要返回原始数据,只需要统计数据
requestbuilder.setSize(0);
BoolQueryBuilder bqb = QueryBuilders.boolQuery();
String host = param.getHost();
if(StringUtils.isNotEmpty(host))
{
bqb.must(QueryBuilders.termQuery("host", param.getHost()));
}
String type = param.getType();
if(StringUtils.isNotEmpty(type))
{
bqb.must(QueryBuilders.termQuery("_type", param.getHost()));
}
requestbuilder.setQuery(bqb);
//时间过滤
String date = param.getTimestamp();
if(StringUtils.isNotEmpty(date))
{
bqb.must(QueryBuilders.rangeQuery("@timestamp").gte(date).lte(date));
}
//统计规则
DateHistogramAggregationBuilder aggregation = AggregationBuilders.dateHistogram("sum_data");
aggregation.field("@timestamp");
//统计周期 1天
aggregation.dateHistogramInterval(DateHistogramInterval.DAY);
aggregation.format("yyyy-MM-dd");
requestbuilder.addAggregation(aggregation);
//成功失败group by count
TermsAggregationBuilder termsAggregation = AggregationBuilders.terms("group_count").field("suc_flag.keyword").minDocCount(0);
aggregation.subAggregation(termsAggregation);
SearchResponse myresponse = requestbuilder.get();
Map<String, Aggregation> aggMap = myresponse.getAggregations().asMap();
InternalDateHistogram idh = (InternalDateHistogram) aggMap.get("sum_data");
List<Bucket> buckets = idh.getBuckets();
TradesMonitorVO result = new TradesMonitorVO();
if(buckets.size() > 0){
Bucket bucket = buckets.get(0);
//时间戳
result.setTimestamp(bucket.getKeyAsString());
//交易量
long count = bucket.getDocCount();
result.setTotalNum(count);
Map<String, Aggregation> subAggMap = bucket.getAggregations().asMap();
StringTerms groupCouont = (StringTerms)subAggMap.get("group_count");
//交易成功数
long sucCount = groupCouont.getBucketByKey("0").getDocCount();
result.setSuccNum(sucCount);
//交易失败数
long failCount = groupCouont.getBucketByKey("1").getDocCount();
result.setFailNum(failCount);
}
return result;
}