elasticSearch聚合查询案例(按照小时、天统计数据)

es查询json


{
  "from": 0,
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "aggs": {
    "group_by_captureTime": {
      "date_histogram": {
        "field": "captureTime", //根据这个时间字段统计
        "interval": "1d",//统计时间 间隔 可用 天=1d 时=1h 分等
        "time_zone": "+08:00",//设置时区
        "format": "yyyy-MM-dd HH",//统计反馈key
        "min_doc_count": 0
      }
    }
  }
}

查询返回结果

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1389,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "group_by_captureTime": {
            "buckets": [
                {
                    "key_as_string": "2021-10-09",
                    "key": 1633708800000,
                    "doc_count": 872
                },
                {
                    "key_as_string": "2021-10-10",
                    "key": 1633795200000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-11",
                    "key": 1633881600000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-12",
                    "key": 1633968000000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-13",
                    "key": 1634054400000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-14",
                    "key": 1634140800000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-15",
                    "key": 1634227200000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-16",
                    "key": 1634313600000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-17",
                    "key": 1634400000000,
                    "doc_count": 0
                },
                {
                    "key_as_string": "2021-10-18",
                    "key": 1634486400000,
                    "doc_count": 148
                },
                {
                    "key_as_string": "2021-10-19",
                    "key": 1634572800000,
                    "doc_count": 369
                }
            ]
        }
    }
}

对应java 代码


	public AlarmCameraResponse collectAlarmByCameraTime(AlarmCameraRequest param) {
		AlarmCameraResponse response = AlarmCameraResponse.builder().previousTimes(0L).build();

		long startTime = param.getStartTime()-24*60*60*1000*param.getCollectType();
		//设置索引
		SearchRequest searchRequest = new SearchRequest("alarm_index");
		//构建查询
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
		// 时间视频源等过滤填写到boolBuilder
		boolBuilder.must(termsQuery("cameraSerial.keyword", param.getCameraSerials()));

		RangeQueryBuilder query = QueryBuilders.rangeQuery("captureTime").includeLower(true).includeUpper(false);
		query.from(startTime).to(param.getEndTime());
		boolBuilder.must(query);

		sourceBuilder.query(boolBuilder);
		// 文档数据不查询,填写0,只查询聚合数据
		sourceBuilder.size(0);

		//根据时间范围确定查询数据分组大小
		DateHistogramInterval dateHistogramInterval = null;
		String pattern = null;
		if(param.getCollectType()==1){
			dateHistogramInterval = DateHistogramInterval.hours(1);
			pattern = hourPattern;
		}else{
			dateHistogramInterval = DateHistogramInterval.days(1);
			pattern = dayPattern;
		}
		AggregationBuilder aggregation = AggregationBuilders.dateHistogram("group_by_captureTime")  // 聚合名称
				.field("captureTime")                                                                                                                // 聚合字段
				.dateHistogramInterval(dateHistogramInterval)                                                //聚合间隔,1小时
				.timeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))) // key as string的格式化时区
				.format(pattern);                                                                                                   // key as string的格式划格式

		sourceBuilder.aggregation(aggregation);

		searchRequest.source(sourceBuilder);
		//发送请求
		SearchResponse searchResponse = null;
		try {
			log.info(searchRequest.toString());
			searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
			log.error("统计查询异常:",e);
			return response;
		}

		//获取聚合的结果
		Map<String,Long> map = new LinkedHashMap<>();
		Aggregations aggregations = searchResponse.getAggregations();
		List<Aggregation> aggregationsList = aggregations.asList();
		for (Aggregation aggregation1 : aggregationsList) {
			List<? extends Histogram.Bucket> buckets = ((Histogram)aggregation1).getBuckets();
			for (Histogram.Bucket bucket : buckets){
				String keyAsString = bucket.getKeyAsString();
				Long count = bucket.getDocCount();
				map.put(keyAsString,count);
				
			}
		}

		return response;
	}


实际请求es json数据

{
	"size": 0,
	"query": {
		"bool": {
			"must": [
				{
					"terms": {
						"cameraSerial.keyword": [
							"5lmc67p7m7sw",
							"4fb5c6be735a84a6aa60b984b1cff6e7a286a180d09900ca274aa82fd8f74db4",
							"dcb95922a3167e92d9c6321cf73a778918fc89a9225aeef3c8da09973f88b985",
							"5lmbwwqgsq9s"
						],
						"boost": 1.0
					}
				},
				{
					"range": {
						"captureTime": {
							"from": 1634572800000,
							"to": 1634745599000,
							"include_lower": true,
							"include_upper": false,
							"boost": 1.0
						}
					}
				}
			],
			"adjust_pure_negative": true,
			"boost": 1.0
		}
	},
	"aggregations": {
		"group_by_captureTime": {
			"date_histogram": {
				"field": "captureTime",
				"format": "yyyy-MM-dd-HH",
				"time_zone": "Asia/Shanghai",
				"interval": "1h",
				"offset": 0,
				"order": {
					"_key": "asc"
				},
				"keyed": false,
				"min_doc_count": 0
			}
		}
	}
}

以上代码是根据条件过滤后,再根据入参判断统计时间间隔,希望对大家有帮助,es使用的是高版本客户端


版权声明:本文为weixin_43704834原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。