ElasticSearch - 根据时间区间查询

1. 需求分析

项目需求:根据时间区间查询elasticsearch中的数据

查询最近7天的数据,前端请求路径:

https://10.87.67.226/chahua/api/v1/list?endTime=1651288728694&startTime=1650683928694&timeScope=last7d

查询最近30天的数据,前端请求路径:

endTime=1651288728694&startTime=1650683928694&timeScope=last30d

查询最近3个月的数据,前端请求路径:

endTime=1651289076819&startTime=1643513076819&timeScope=last3m

查询最近半年的数据,前端请求路径:

endTime=1651289131524&startTime=1635737131524&timeScope=lasthalfyear

根据自定义时间区间查询,前端请求路径:

endTime=1652803199999&startTime=1649865600000&timeScope=custom

2. 时间区间枚举类TimeScopeEnum

@AllArgsConstructor
@Getter
public enum TimeScopeEnum {

    /**
     * 最近24小时
     */
    LAST_24_HOURS("last24h", 1),

    /**
     * 最近7天
     */
    LAST_7_DAYS("last7d", 7),

    /**
     * 最近14天
     */
    LAST_14_DAYS("last14d", 14),

    /**
     * 最近30天
     */
    LAST_30_DAYS("last30d", 30),

    /**
     * 最近三个月
     */
    LAST_3_MONTH("last3m", 3),

    /**
     * 最近半年
     */
    LAST_HALF_YEAR("lasthalfyear", 6);

    /**
     * 前端传入参数名称
     */
    private final String name;

    /**
     * 对应天数
     */
    private final Integer value;

    /**
     * 根据前端传入参数名称获取TimeScopeEnum
     *
     * @param name last_7_days...
     * @return TimeScopeEnum
     */
    public static TimeScopeEnum getTimeScopeByName(String name) {
        for (TimeScopeEnum timeScopeEnum : TimeScopeEnum.values()) {
            if (timeScopeEnum.getName().equals(name)) {
                return timeScopeEnum;
            }
        }
        return null;
    }
}

3. 前端请求Qo类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "用户表的查询参数")
public class AssetsStatisticQo implements Serializable {

    private static final long serialVersionUID = 438544871152602645L;

    @ApiModelProperty("开始时间")
    @NotNull(message = "开始时间不能为空")
    private Long startTime;

    @ApiModelProperty("结束时间")
    @NotNull(message = "结束时间不能为空")
    private Long endTime;

    @NotBlank
    @ApiModelProperty("时间范围")
    private String timeScope;

}

4. 时间处理的工具类

@Slf4j
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "统计日期查询")
public class TimeArgumentQo implements Serializable {

    private static final long serialVersionUID = 942383215460551593L;

    /**
     * 创建时间
     */
    private final Date nowDate = DateUtil.date();

    /**
     * 起始时间
     */
    private Date startDate = null;

    /**
     * 截止时间
     */
    private Date endDate = null;

    /**
     * 时间范围参数
     */
    private TimeScopeEnum timeScope = null;

    /**
     * 计算出起始和结束时间
     */
    public TimeArgumentQo(Long startTimestamp, Long endTimestamp, String timeScopeStr) {
        if (StringUtils.isBlank(timeScopeStr)) {
            log.error("input time parameter error. timeScopeStr: {}", timeScopeStr);
            throw new StatisticException("input.params.time.error");
        }
        // 如果是自定义查询时间
        if ("custom".equals(timeScopeStr)) {
            if (startTimestamp != null && startTimestamp > 0L) {
                startDate = DateUtil.date(startTimestamp);
            }
            if (endTimestamp != null && endTimestamp > 0L) {
                endDate = DateUtil.date(endTimestamp);
            }
            boolean flag = startDate != null && endDate != null && (startDate.equals(endDate) || startDate.after(endDate));
            if (flag) {
                throw new StatisticException("input.params.time.error");
            }
        } else {
            // 如果不是自定义查询时间
            timeScope = TimeScopeEnum.getTimeScopeByName(timeScopeStr);
            if (Objects.isNull(timeScope)) {
                throw new StatisticException("input.params.time.error");
            }
            if (TimeScopeEnum.LAST_24_HOURS.equals(timeScope) || TimeScopeEnum.LAST_7_DAYS.equals(timeScope) || TimeScopeEnum.LAST_14_DAYS.equals(timeScope)
                    || TimeScopeEnum.LAST_30_DAYS.equals(timeScope)) {
                /* 最近24小时,最近x天(x>1) */
                startDate = DateUtil.offsetDay(nowDate, -timeScope.getValue());
                endDate = nowDate;
            } else {
                /* 最近3个月,最近半年 */
                startDate = DateUtil.offsetMonth(nowDate, -timeScope.getValue());
                endDate = nowDate;
            }
        }
    }
}

5. 执行查询

public void queryList(AssetsStatisticQo assetsStatisticQo) {
    // 转换时间区间
    TimeArgumentQo timeArgumentQo = new TimeArgumentQo(
            assetsStatisticQo.getStartTime(),
            assetsStatisticQo.getEndTime(),
            assetsStatisticQo.getTimeScope()
    );
	getHasFallAssets(timeArgumentQo)
}

private List<AssetsStatisticEntity> getHasFallAssets(TimeArgumentQo timeArgumentQo) {
        SearchRequest searchRequest = new SearchRequest("future-index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 查询日期区间
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        // lastTime为es中的字段
        RangeQueryBuilder timeRangeQuery = QueryBuilders.rangeQuery("lastTime")
            .gte(timeArgumentQo.getStartDate().getTime())
            .lte(timeArgumentQo.getEndDate().getTime());
        boolQuery.must(timeRangeQuery);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我一直在流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值