需求是这样的:
近7天的用户登陆统计,根据日期来返回的要是data:[{date:“2021-04-01”,count:“1”}]
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
//这个是获取7天前的时间,比如说今天是4月29,7天前就是4月23,
//因为要包括今天,输出为"2021-04-23"
String startTime = DateUtil.getWeekFromNow();
//这个是输出今天的时间,格式为"2021-04-29"
String endTime = formater.format(new Date());
List<LoginLogDoc> loginLogDocList = new ArrayList<>();
List<EchartsVO> echartsVOS = new ArrayList<>();
BoolQueryBuilder bqb = QueryBuilders.boolQuery();
bqb.must(QueryBuilders.rangeQuery("createTime").from(startTime).to(endTime));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(bqb).withIndices("login_log").withTypes("login_log").withSearchType(SearchType.DEFAULT).build();
loginLogDocList= elasticsearchTemplate.queryForList(searchQuery,LoginLogDoc.class);
//因为我的createTime 是String型的,而且他的格式为"2021-04-29 12:00:00"
//循环list,把时间格式统一成yyyy-MM-dd
for (LoginLogDoc loginLogDoc : loginLogDocList) {loginLogDoc.setCreateTime(loginLogDoc.getCreateTime().substring(0,10));}
//loginLogDocList其实不是我想要返回的,因为我们主要是想返回 时间和count,现在查出来的是一条条的记录,我们要根据这些记录分组
//再把list根据时间createTime来分组统计,然后存入map
Map resultMap = new HashMap();
for (LoginLogDoc loginLogDoc : loginLogDocList) {loginLogDoc.setCreateTime(loginLogDoc.getCreateTime());Object obj = resultMap.get(loginLogDoc.getCreateTime());if(obj != null){resultMap.put(loginLogDoc.getCreateTime(), ((Integer) obj + 1));}else{resultMap.put(loginLogDoc.getCreateTime(), 1);}
}
//再将map转换成我们需要的list。echartsVOS
resultMap.forEach((key, value) -> {EchartsVO echartsVO = new EchartsVO();echartsVO.setDate((String) key);echartsVO.setCount((Integer) value);echartsVOS.add(echartsVO);
});
//最好这个echartsVOS就是我们要的
login_log 是我们的实体类的名称:
@Getter
@Setter
@ToString
@Document(indexName = "login_log", type = "login_log", createIndex = false)
public class LoginLogDoc implements Serializable {/*** 记录id*/@Idprivate String loginLogId;/*** 用户id*/private Integer userId;/*** 登陆时间*/private String createTime;
}
有什么问题就给我留言吧