關注 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);