//創(chuàng)建索引
PUT /test
//索引結(jié)構(gòu)
PUT /test/_mapping
{
"properties": {
"insertTime": {
"type": "date"
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"pmValue": {
"type": "double"
}
}
}
//批量插入數(shù)據(jù)
PUT /test/_bulk
{"index":{}}
{"id":1000,"pmValue":20.13,"insertTime":"2022-08-21"}
{"index":{}}
{"id":2000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":3000,"pmValue":20.13,"insertTime":"2022-08-20"}
{"index":{}}
{"id":4000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":5000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":6000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":7000,"pmValue":20.13,"insertTime":"2022-08-22"}
{"index":{}}
{"id":8000,"pmValue":20.13,"insertTime":"2022-08-19"}
按照id、時間分組求pmValue的平均值
GET /test/_search
{
"size": 0,
"aggs": {
"ID": {
"terms": {
"field": "id.keyword"
},
"aggs": {
"時間": {
"date_histogram": {
"field": "insertTime",
"interval": "day",
"format": "yyyy-MM-dd",
"min_doc_count": 0,
"extended_bounds": {
"min": "2022-08-14",
"max": "2022-08-20"
}
},
"aggs": {
"平均值": {
"avg": {
"field": "pmValue"
}
}
}
}
}
}
}
}
查詢結(jié)果:
以上對應(yīng)的Java代碼文章來源:http://www.zghlxwxcb.cn/news/detail-524574.html
@Autowired
private RestHighLevelClient client;
public Map<Object,List<Map<String,Object>>> searchFlow(String index,List<Map<String,Object>> paramList){
//搜索請求
SearchRequest request = new SearchRequest(index);
//請求條件構(gòu)建器,這里和mybatis中的自定義查詢有點類型
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder query = QueryBuilders.boolQuery();
for (Map<String, Object> map : paramList) {
BoolQueryBuilder query1 = QueryBuilders.boolQuery();
map.forEach((k, v) -> {
query1.must(QueryBuilders.termsQuery(k + ".keyword", v));
});
query.should(query1);
}
boolQueryBuilder.must(query);
//其他查詢條件
boolQueryBuilder.must(QueryBuilders.termsQuery("字段" + ".keyword", "字段值"));
//id分組
TermsAggregationBuilder linkAgg = AggregationBuilders.terms("linkAgg").field("id.keyword");
//時間分組
String extendedBoundsMin = DateUtil.format(DateUtil.offsetDay(new Date(), -6), "yyyy-MM-dd");
String extendedBoundsMax = DateUtil.format(new Date(), "yyyy-MM-dd");
DateHistogramAggregationBuilder dateHistogramAggregationBuilder = AggregationBuilders
.dateHistogram("timeAgg").field("insertTime").dateHistogramInterval(DateHistogramInterval.DAY)
.format("yyyy-MM-dd").minDocCount(0).extendedBounds(new ExtendedBounds(extendedBoundsMin,extendedBoundsMax));
//取出速率的平均值
AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("outSpeedAvg").field("pmValue");
dateHistogramAggregationBuilder.subAggregation(avgAggregationBuilder);
linkAgg.subAggregation(dateHistogramAggregationBuilder);
builder.aggregation(linkAgg);
builder.query(boolQueryBuilder);
builder.size(10000);
//把查詢添加放入請求中
request.source(builder);
//建立SearchResponse
SearchResponse response;
Map<Object,List<Map<String,Object>>> map = new HashMap<>(16);
try {
response = client.search(request, RequestOptions.DEFAULT);
Aggregations aggregations = response.getAggregations();
Terms linkResTerms = aggregations.get("linkAgg");
List<? extends Terms.Bucket> linkIdBuckets = linkResTerms.getBuckets();
if (linkIdBuckets != null) {
for (Terms.Bucket bucket:linkIdBuckets){
List<Map<String,Object>> list = new ArrayList<>();
Object linkId = bucket.getKey();
Aggregations aggregations1 = bucket.getAggregations();
ParsedDateHistogram dateHistogram = aggregations1.get("timeAgg");
List<? extends Histogram.Bucket> timeBuckets = dateHistogram.getBuckets();
if (timeBuckets != null) {
for (Histogram.Bucket bucket1:timeBuckets) {
Map<String,Object> valueMap = new HashMap<>(16);
String time = bucket1.getKeyAsString();
Aggregations aggregations2 = bucket1.getAggregations();
Avg outSpeedAvg = aggregations2.get("outSpeedAvg");
double value = outSpeedAvg.getValueAsString() == "Infinity"?0:Double.valueOf(outSpeedAvg.getValueAsString());
valueMap.put("time",time);
valueMap.put("value",value);
list.add(valueMap);
}
map.put(linkId,list);
}
}
}
} catch (Exception e) {
log.error("es查詢異常",e);
}
return map;
}
更多內(nèi)容課參考:
https://www.cnblogs.com/xiaoyh/p/16264715.html文章來源地址http://www.zghlxwxcb.cn/news/detail-524574.html
到了這里,關(guān)于ES時間分組統(tǒng)計查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!