public List< AlarmTop5Vo> getAlarmTimesTop5 ( Integer beforeDays, String regionId) {
List< AlarmTop5Vo> result = new ArrayList < > ( ) ;
RestHighLevelClient client = null;
try {
client = EsPoolUtil. getClient ( ) ;
SearchRequest searchRequest = new SearchRequest ( "index_name" ) . types ( "type_name" ) ;
Script script = new Script ( "doc['taskId'].value +'####'+doc['roadId'].value" ) ;
LocalDateTime zeroTime = LocalDateTime. now ( ) . withHour ( 0 ) . withMinute ( 0 ) . withSecond ( 0 ) . withNano ( 0 ) ;
long endTimeStamp = zeroTime. plusDays ( 1 L) . toInstant ( ZoneOffset. of ( "+8" ) ) . toEpochMilli ( ) ;
long startTimeStamp = zeroTime. minusDays ( beforeDays) . toInstant ( ZoneOffset. of ( "+8" ) ) . toEpochMilli ( ) ;
String tag5AggName = "top5Agg" ;
String latestRoadNameAggName = "latestRoadNameAgg" ;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder ( )
. query ( QueryBuilders. boolQuery ( )
. must ( QueryBuilders. rangeQuery ( "timestamp" ) . gte ( startTimeStamp) . lt ( endTimeStamp) )
. must ( QueryBuilders. termQuery ( "isWarn" , "1" ) )
. must ( QueryBuilders. termQuery ( "groupId" , regionId) ) )
. size ( 0 )
. aggregation ( AggregationBuilders. terms ( tag5AggName)
. script ( script) . order ( Terms. Order. count ( false ) ) . size ( 5 )
. subAggregation ( AggregationBuilders. topHits ( latestRoadNameAggName) . sort ( "timestamp" , SortOrder. DESC) . fetchSource ( "roadName" , null) . size ( 1 ) )
) ;
searchRequest. source ( searchSourceBuilder) ;
SearchResponse searchResponse = client. search ( searchRequest) ;
MultiBucketsAggregation top5Agg = searchResponse. getAggregations ( ) . get ( tag5AggName) ;
List< ? extends MultiBucketsAggregation. Bucket > buckets = top5Agg. getBuckets ( ) ;
buckets. forEach ( bucket - > {
ParsedTopHits latestRoadNameAgg = bucket. getAggregations ( ) . get ( latestRoadNameAggName) ;
SearchHit searchHit = latestRoadNameAgg. getHits ( ) . getAt ( 0 ) ;
String roadName = searchHit. getSource ( ) . get ( "roadName" ) . toString ( ) ;
long count = bucket. getDocCount ( ) ;
AlarmTop5Vo vo = new AlarmTop5Vo ( ) ;
vo. setMonitorSite ( roadName) ;
vo. setTimes ( count) ;
result. add ( vo) ;
} ) ;
return result;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
if ( client != null) {
EsPoolUtil. returnClient ( client) ;
}
}
return new ArrayList < > ( ) ;
}
GET / index_name/ type_name
{
"size" : 0 ,
"query" : {
"bool" : {
"must" : [
{
"range" : {
"timestamp" : {
"gte" : 1589004201387 ,
"lte" : 1589004201550
}
}
} ,
{
"term" : {
"isWarn" : {
"value" : "1"
}
}
}
]
}
} ,
"aggs" : {
"top5Agg" : {
"terms" : {
"script" : "doc['taskId'].value +'####'+doc['roadId'].value" ,
"order" : {
"_count" : "desc"
} ,
"size" : 5
} ,
"aggs" : {
"latestRoadNameAgg" : {
"top_hits" : {
"_source" : { "includes" : "roadName" } ,
"sort" : [ {
"timestamp" : {
"order" : "asc"
}
} ] ,
"size" : 1
}
}
}
}
}
}