如何为Elasticsearch索引文档设置TTL并支持Spring Boot配置
错误原因
你使用的_ttl映射参数是Elasticsearch早期的试验性特性,在2.x版本就被标记为废弃,6.x及以上版本已经完全移除,因此高版本ES无法识别该参数,直接抛出参数不支持的错误。
目前官方推荐的TTL实现方案
现在Elasticsearch统一使用索引生命周期管理(ILM) 实现文档自动过期删除,分为两种常用场景:
场景1:整个索引所有文档统一过期
适合时序类数据,整个索引内所有文档的保存周期一致:
- 创建ILM策略,示例设置索引生成24小时后自动删除:
PUT _ilm/policy/order_ttl_policy { "policy": { "phases": { "hot": { "actions": {} }, "delete": { "min_age": "24h", "actions": { "delete": {} } } } } }
- 将策略绑定到
order_index索引:
PUT order_index/_settings { "index.lifecycle.name": "order_ttl_policy" }
场景2:单文档自定义过期时间
如果需要不同文档设置不同的过期时长,可自行添加过期时间字段配合删除逻辑实现:
- 先给索引新增
expire_at日期类型字段:
PUT order_index/_mapping/order_doc { "properties": { "expire_at": { "type": "date" } } }
- 写入文档时主动计算并设置
expire_at的值,比如需要24小时过期就设置为当前时间加24小时。 - 7.16及以上版本ES可直接创建带字段条件的ILM策略,自动删除到期文档:
PUT _ilm/policy/order_doc_ttl_policy { "policy": { "phases": { "hot": { "actions": {} }, "delete": { "min_age": "0ms", "conditions": { "field": "expire_at", "field_value": "now" }, "actions": { "delete": {} } } } } }
- 将策略绑定到索引即可。
如果你的ES版本低于7.16,不支持ILM按字段条件删除,可以自行在应用中加定时任务,定期执行delete_by_query删除过期文档:
POST order_index/_delete_by_query { "query": { "range": { "expire_at": { "lte": "now" } } } }
Spring Boot集成配置
如果你使用Spring Data Elasticsearch,可按以下方式实现配置化管理:
- 在application.yml中添加自定义配置项:
spring: elasticsearch: uris: http://localhost:9200 # 自定义TTL配置 elasticsearch: index: order: ilm-policy: order_doc_ttl_policy default-ttl: 24h
- 实体类添加
expire_at字段注解:
@Field(type = FieldType.Date) private Date expireAt;
- 写启动监听类,项目启动时自动校验ILM策略是否存在,不存在则自动创建;索引创建时自动绑定对应ILM策略。
- 写入文档时读取配置的默认TTL,自动计算
expireAt的值写入即可。
内容的提问来源于stack exchange,提问作者Lho Ben
相关产品推荐
相关产品推荐

