ElasticSearch Java SpringBoot根据时间范围分组求和

需求是这样的:
近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
     */
    @Id
    private String loginLogId;

    /**
     * 用户id
     */
    private Integer userId;

    /**
     * 登陆时间
     */
    private String createTime;
}

有什么问题就给我留言吧

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值