ElasticSearch - 根据时间区间查询

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-519765.html

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);
}

到了这里,关于ElasticSearch - 根据时间区间查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Elasticsearch计算距离,根据距离排序,地理点和地理多边形范围查找

    Elasticsearch计算距离,根据距离排序,地理点和地理多边形范围查找

    Elasticsearch 计算并返回距离一共有两种方法: sort 和 script_fields CentOS 7.6 Elasticsearch 7.10 响应结果如下, hits 下的 sort 字段就是距离,单位:km。 5.x 以前支持:distanceInKm(lat, lon) 函数,后来被废弃。现在只支持 arcDistance(lat, lon) 函数:计算两点距离,单位为:m。响应结果如下,

    2024年02月09日
    浏览(15)
  • Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    Springboot 整合ElasticSearch 常用的插入查询,模糊查询,范围查询

    repository.deleteById(id); } catch (Exception ex) { ex.printStackTrace(); return false; } return true; } public Dog saveDog(Dog dog) { try { Dog save = repository.save(dog); System.out.println(“结果:”+save.toString()); return save; } catch (Exception ex) { ex.printStackTrace(); return null; } } public Boolean saveDogAll(List dogsList) { try { reposit

    2024年04月22日
    浏览(15)
  • ElasticSearch序列 - SpringBoot整合ES:范围查询 range

    01. ElasticSearch range查询是什么? Elasticsearch 中的 range 查询可以用于查询某个字段在一定范围内的文档。 range 查询可同时提供包含和不包含这两种范围表达式,可供组合的选项如下: gt : 大于(greater than) lt : 小于(less than) gte : = 大于或等于(greater than or equal to) lte : = 小于

    2024年02月09日
    浏览(11)
  • ES Elasticsearch日期范围查询和查不出的坑

    ES Elasticsearch日期范围查询和查不出的坑

    如果字段为字符串类型,需要在字段后面加 .keyword 不加会出现查不出的问题。 查询全部,有大于2022-01-01的数据 按日期范围查询却没有查出来 字段后面加“.keyword”即可,分词问题

    2024年02月11日
    浏览(11)
  • ElasticSearch支持根据英文或者数字进行模糊查询

    ElasticSearch支持根据英文或者数字进行模糊查询

    提示:以下操作均在kibana7.7.0中操作。 根据es去查询商品的名称,中文查询能查询出数据,但是只输入部分英文或者数字,查询不出数据。 es中的分词器,只将全部的数字和英文做了分词,即将他们看成一个单词,所以,只输入部分英文或者数字时,不存在该部分的分词,估

    2024年02月12日
    浏览(8)
  • Java根据id对elasticsearch查询操作

    一、根据一个id查询 二、根据多个ids查询

    2024年02月12日
    浏览(11)
  • ElasticSearch序列 - SpringBoot整合ES:根据指定的 ids 查询

    1. ElasticSearch 根据 ids 查询文档 ① 索引文档,构造数据 ② 查询文档 id 为 1 或者 2 的文档: 我们索引文档时,文档的id为整型,为什么查询出来的文档 id为字符串类型呢?如果我们使用字符串类型的文档id查询呢? 可以看到仍然可以查询到匹配的文档。 在Elasticsearch中,文档

    2024年02月11日
    浏览(12)
  • elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询

    elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询

    elasticsearch 的查询依然是基于 JSON 风格的 DSL 来实现的。 Elasticsearch 提供了基于 JSON 的 DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去

    2024年01月18日
    浏览(15)
  • LINUX根据时间范围检索文件

    LINUX根据时间范围检索文件

    1.查找2023-01-05到2023-01-06号之间的文件,使用如下命令即可: 2.找出 3 天”以前”被改动过的文件 72小时之前 3.找出 3 天內被改动过的文件 (0 ~ 72 小时內) 4.找出前第 3 天被改动过的文件 (72 ~ 96 小时) 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使

    2024年02月12日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包