Elasticsearch中为已存在索引设置默认TTL失败求助
解决Elasticsearch已存在索引无法设置默认TTL的问题
嘿,我来帮你搞定这个问题!首先看你收到的resource_already_exists_exception错误,原因很直白——你用PUT my_index是想创建新索引,但这个索引已经存在了,Elasticsearch当然不会允许你覆盖已存在的索引啦。另外还要提一句:TTL(也就是_ttl字段)在Elasticsearch 6.0及以上版本已经被官方弃用,现在更推荐用「索引生命周期管理(ILM)」来实现数据自动过期的需求。下面分两种情况给你解决方案:
情况1:你的ES版本低于6.0(还支持_ttl)
对于已经存在的索引,不能用创建索引的PUT请求,得用更新映射的API来修改已有的索引配置:
PUT my_index/_mapping/my_type { "_ttl": { "enabled": true, "default": "24h" } }
这个请求会直接更新my_index里my_type的映射,开启TTL功能并设置默认24小时的过期时间,新写入的文档都会自动带上这个过期时间。
情况2:你的ES版本6.0及以上(推荐用ILM替代TTL)
因为_ttl已经被弃用,官方更建议用ILM来管理索引的生命周期,实现数据自动删除。步骤很简单:
- 先创建一个生命周期策略,定义数据在24小时后自动删除:
PUT _ilm/policy/expire_after_24h { "policy": { "phases": { "delete": { "min_age": "24h", "actions": { "delete": {} } } } } }
- 把这个策略关联到你的
my_index上:
PUT my_index/_settings { "index": { "lifecycle": { "name": "expire_after_24h" } } }
这样之后,索引里的文档在创建满24小时后,ILM就会自动帮你清理掉它们。如果你的旧文档需要按创建时间过期,记得确保文档里有类似@timestamp的时间字段,然后可以在ILM策略里指定用这个字段来计算过期时间(调整策略里的phase.delete.actions.delete部分即可)。
内容的提问来源于stack exchange,提问作者Arnab Biswas
相关产品推荐
相关产品推荐

