本文目录导读:

- 基于 Curator(官方推荐,最成熟)
- 使用 Shell 脚本 + curl(简单轻量)
- 使用 PowerShell 脚本(Windows 环境)
- 使用 Python 脚本(灵活,便于自定义)
- 使用 ILM(Index Lifecycle Management,生产环境最佳实践)
是的,可以通过脚本自动删除旧的 Elasticsearch 索引,通常基于索引名称中的日期模式(如 logs-2025-01-01)或索引的创建时间来判断。
以下是几种常见的实现方案:
基于 Curator(官方推荐,最成熟)
Elasticsearch 官方工具,通过配置文件定义删除策略。
安装:
pip install elasticsearch-curator
配置文件 delete_old_indices.yml:
actions:
1:
action: delete_indices
description: "Delete indices older than 30 days"
options:
ignore_empty_list: True
disable_action: False
filters:
- filtertype: age
source: name
direction: older
unit: days
unit_count: 30
timestring: '%Y.%m.%d' # 根据你的索引命名格式调整
- filtertype: pattern
kind: prefix
value: logs- # 只处理以 logs- 开头的索引
运行:
curator --config delete_old_indices.yml
使用 Shell 脚本 + curl(简单轻量)
通过 Elasticsearch API 获取索引列表,按名称日期过滤后删除。
#!/bin/bash
ES_HOST="http://localhost:9200"
# 设置保留天数,删除 30 天前的索引
RETENTION_DAYS=30
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y.%m.%d)
# 获取需要删除的索引列表(假设索引格式为 logs-YYYY.MM.DD)
INDICES_TO_DELETE=$(curl -s "$ES_HOST/_cat/indices/logs-*?h=index" | \
awk -F'-' -v cutoff="$CUTOFF_DATE" '$2 < cutoff {print $0}')
if [ -n "$INDICES_TO_DELETE" ]; then
echo "即将删除以下索引:"
echo "$INDICES_TO_DELETE"
for index in $INDICES_TO_DELETE; do
echo "删除索引:$index"
curl -s -X DELETE "$ES_HOST/$index"
echo ""
done
else
echo "没有需要删除的索引。"
fi
注意事项:
- 请确保索引命名格式是固定的(如
logs-2025.01.01、app-20250101)。 - 测试时先加上
echo预览要删除的索引,确认无误后再实际删除。
使用 PowerShell 脚本(Windows 环境)
$esHost = "http://localhost:9200"
$retentionDays = 30
$cutoffDate = (Get-Date).AddDays(-$retentionDays).ToString("yyyy.MM.dd")
# 获取索引列表(假设索引名为 logs-yyyy.MM.dd)
$indices = Invoke-RestMethod "$esHost/_cat/indices/logs-*?h=index" | Select-String -Pattern "logs-\d{4}\.\d{2}\.\d{2}"
foreach ($index in $indices) {
$datePart = $index -replace "logs-", ""
if ($datePart -lt $cutoffDate) {
Write-Host "删除索引: $index"
Invoke-RestMethod -Method Delete "$esHost/$index"
}
}
使用 Python 脚本(灵活,便于自定义)
from elasticsearch import Elasticsearch
from datetime import datetime, timedelta
es = Elasticsearch("http://localhost:9200")
retention_days = 30
cutoff = datetime.now() - timedelta(days=retention_days)
# 获取所有以 logs- 开头的索引
indices = es.indices.get(index="logs-*")
for index_name in indices:
# 假设索引格式 logs-2025.01.01,提取日期部分
try:
date_str = index_name.split("-")[1]
index_date = datetime.strptime(date_str, "%Y.%m.%d")
if index_date < cutoff:
print(f"删除索引: {index_name}")
es.indices.delete(index=index_name)
except:
pass
使用 ILM(Index Lifecycle Management,生产环境最佳实践)
如果系统允许,建议直接在 Elasticsearch 层面配置 ILM 策略,无需额外脚本。
ILM 策略示例(删除 30 天前的索引):
PUT _ilm/policy/30_days_delete
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"set_priority": {
"priority": 100
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
应用到索引模板:
PUT _index_template/logs_template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"index.lifecycle.name": "30_days_delete"
}
}
}
| 场景 | 推荐方案 |
|---|---|
| 简单脚本、快速实现 | Shell + curl |
| 生产环境、灵活配置 | Curator |
| 已有 Python 栈 | Python elasticsearch-py |
| 长期维护、无需运维 | ILM 策略(最佳) |
重要安全建议:
- 删除前先执行预览模式,确保不会误删有用数据。
- 生产环境删除索引前请考虑是否需要数据备份或先快照再删除。
- 建议将脚本通过 cron 或 Windows 任务计划程序定期执行。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播