/**
* 實時統計查詢
* @param dto
* @param esSkip
* @param pageSize
* @return
*/
public Map<String, Object> queryCommonMetricByTime(final QueryCommonV1DTO dto, final String esSkip, final Integer pageSize) {
final Map<String, Object> map = new HashMap<>();
final JSONArray resultArray = new JSONArray();
if(!existTable(dto.getIndex())) {
return map;
}
final BoolQueryBuilder boolQueryBuild = QueryBuilders.boolQuery();
//兩個時間
if(StringUtils.isEmpty(dto.getStartTime())) {
final QueryBuilder rangeBuilder = QueryBuilders.rangeQuery("timestamp").lte(dto.getEndTime());
boolQueryBuild.filter(rangeBuilder);
}else {
final QueryBuilder rangeBuilder = QueryBuilders.rangeQuery("timestamp").gte(dto.getStartTime()).lte(dto.getEndTime());
boolQueryBuild.filter(rangeBuilder);
}
//設備id
final QueryBuilder deviceIdTermsBuilder = QueryBuilders.termQuery("deviceid", dto.getDeviceCode());
boolQueryBuild.filter(deviceIdTermsBuilder);
//測點
if(!StringUtils.isEmpty(dto.getMetric())) {
final QueryBuilder metricTermsBuilder = QueryBuilders.termQuery("metric", dto.getMetric());
boolQueryBuild.filter(metricTermsBuilder);
}
//查詢列表
SearchRequestBuilder requestBuilder = getTransportClient().prepareSearch(dto.getIndex()).setTypes(dto.getIndex())
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
requestBuilder.setQuery(boolQueryBuild);
requestBuilder.addSort(SortBuilders.fieldSort(TIMESTAMP).order(SortOrder.DESC));
requestBuilder.addSort(SortBuilders.fieldSort("_uid").order(SortOrder.ASC));
requestBuilder.setFrom(0);
requestBuilder.setSize(pageSize);
if(!StringUtils.isEmpty(esSkip)) {
Object[] skip = esSkip.split("@");
requestBuilder.searchAfter(skip);
}
if (LOGGER.isInfoEnabled()) {
LOGGER.info("##### 調用queryCommonMetricByTime聚合語句:\n{} \n#####", requestBuilder.toString());
}
// 4.執行查詢
final SearchResponse response = requestBuilder.execute().actionGet();
final SearchHits searchHits = response.getHits();
//總數
long totalHits = searchHits.totalHits();
map.put("count", totalHits);
// 解析結果
final SearchHit[] hits = searchHits.getHits();
if (hits.length > 0) {
for (SearchHit hit : hits) {
final Map<String, Object> source = hit.getSource();
// 只返回倆個字段
final JSONObject obj = new JSONObject();
// 時間改成time返回
obj.put("time", source.get(BaseField.timestamp));
obj.put(BaseField.metric, source.get(BaseField.metric));
resultArray.add(obj);
}
map.put("data", resultArray);
final Object[] sort = hits[hits.length-1].sortValues();
final StringBuffer skip = new StringBuffer();
for(Object obj : sort) {
skip.append(obj + "@");
}
skip.deleteCharAt(skip.length()-1);
map.put("skip", skip);
}
return map;
}