ElasticSearch创建动态索引
需求:某实例需要按照月份来维护,所以之前的“写死”索引的方式当然不行了。通过百度和看SpringDataElasticSearch官方文档,最后解决了这个问题。
关键技术点: Spel表达式 (通过调用方法来获取新的索引名,方法内处理新索引名的生成逻辑)
实体类部分代码:
从表达式中可以看出:esConfig 是一个bean,调用了getXX方法。
@Document(indexName = "#{esConfig.getApiCallIndexName()}") public class ApiCallRecord { /** * 平台流水号 */ @Id @Field(type = FieldType.Keyword) private String transId; 。。。。。。 }
动态索引Bean代码:
将改类注册成Bean,名称为“esConfig”,其中apiCallIndexNamePrefix,是索引的前缀(为了通用,让它从配置文件取,如果没有那么就设置默认值“api_call_rec_”),方法中的逻辑就是生成逻辑,这样就能够生成api_call_rec_yyyy_MM这样的索引了。
@Component(value = "esConfig") public class ElasticSearchConfiguration { @Value("${esConfig.apiCallIndexName:api_call_rec_}") private String apiCallIndexNamePrefix; public String getApiCallIndexName() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM"); return apiCallIndexNamePrefix + LocalDateTime.now().format(formatter); } }
从Kibana中也能看到确实是生成了动态索引(我最开始是获取当前时间“秒”来测试的,每次处理逻辑后基本都会有新的索引创建。)
参考文档:Spring ES动态索引
该文档就源码级别分析动态索引能起作用的原因,推荐大家看看。非常感谢大佬的分享!
目前功能基本是实现了,后续还有很多可以新优化的吧。。。