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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章