SpringBoot—根据起始时间和终止时间获取ES索引名称范围

关注 wx:CodingTechWork

需求

  根据ES的起始时间字段,查询索引名称范围。前提,索引名称也是按照年月来命名,如es_log_data_m202304

模板

@Slf4j
public class ESUtils{

    private Integer defaultSearchMonth = 6;
    /**
     * 根据起始时间和终止时间获取索引名称范围
     *
     * @param indexNamePrefix 索引前缀
     * @param beginTime       起始时间
     * @param endTime         终止时间
     * @return
     */
    public static List<String> queryEsIndexNameRange(String indexNamePrefix, LocalDateTime beginTime, LocalDateTime endTime) {
        //构建日期字符串列表  yyyyMM
        List<String> indexNameRangeList = new ArrayList<>();
        //设定了起止时间
        if (ObjectUtil.isNotEmpty(beginTime) && ObjectUtil.isNotEmpty(endTime)) {
            //若起始时间在终止时间之后,返回空
            if (beginTime.isAfter(endTime)) {
                return new ArrayList<>();
            }
            //循环处理 条件:起始时间在终止时间之前
            while (beginTime.isBefore(endTime)) {
                //添加起始日期
                indexNameRangeList.add(indexNamePrefix + DateTimeFormatter.ofPattern("yyyyMM").format(beginTime));
                //自增1个月
                beginTime = beginTime.plusMonths(1);
            }
            //考虑2023-02-01 00:00:00  2023-03-03 00:00:00时间范围的查询
            if (!indexNameRangeList.contains(indexNamePrefix + DateTimeFormatter.ofPattern("yyyyMM").format(endTime))) {
                //添加终止日期
                indexNameRangeList.add(indexNamePrefix + DateTimeFormatter.ofPattern("yyyyMM").format(endTime));
            }
        } else {
            //未设定起止时间,默认返回几个月
            LocalDateTime nowTime = LocalDateTime.now();
            //循环处理 条件:起始时间在终止时间之前的默认月数
            for (int i = 0; i < defaultSearchMonth; i++) {
                indexNameRangeList.add(indexNamePrefix + DateTimeFormatter.ofPattern("yyyyMM").format(nowTime));
                //自减月份
                nowTime = nowTime.minusMonths(1);
            }
        }
        log.info("es query indexNameRangeList: {}", indexNameRangeList);
        //返回索引范围list
        return indexNameRangeList;
    }
}

示例

 //索引名称查询列表
List<String> indexNameList = ESUtils.getIndexNameRange("es_log_data_m,LocalDateTime.now(), LocalDateTime.now());
//构建es请求
SearchRequest.Builder builder = new SearchRequest.Builder();
//es query
Query.Builder builder = new Query.Builder();
BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
builder.bool(boolQueryBuilder.build());
Query.Builder builderId = new Query.Builder();
builderId.term(new TermQuery.Builder().field("testId").value(10000L).build());
boolQueryBuilder.must(builderId.build());
//忽略索引不存在的情况
builder.index(indexNameList).query(builder.build()).ignoreUnavailable(true);
posted @ 2023-04-03 19:29  Andya_net  阅读(177)  评论(0编辑  收藏  举报  来源