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);
烧不死的鸟就是凤凰