1. 项目背景与需求解析
在数据管理和运维工作中,我们经常需要清理Elasticsearch(简称ES)中的历史数据。作为一名长期与ES打交道的运维工程师,我发现直接使用Shell脚本操作ES的API是最灵活高效的方式。不同于Kibana界面操作或编程语言调用,Shell脚本可以轻松集成到定时任务中,实现自动化数据清理。
这个方案特别适合以下场景:
- 定期清理超过保留期限的日志数据
- 删除符合特定条件的测试数据
- 批量清理异常数据或无效索引
- 在CI/CD流程中自动清理临时索引
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心工具与技术选型
2.1 基础工具准备
实现这个功能主要依赖两个核心工具:
- cURL命令:用于发送HTTP请求到ES的REST API
- jq工具:用于处理和解析JSON格式的返回结果
安装方法如下(以CentOS为例):
bash复制# 安装cURL(通常系统已自带)
yum install -y curl
# 安装jq
yum install -y jq
2.2 ES API选择
ES提供了多种删除数据的API,我们需要根据具体场景选择:
- 按条件删除:使用Delete By Query API
- 删除整个索引:使用Delete Index API
- 删除特定文档:使用Delete Document API
3. 详细实现步骤
3.1 按条件删除数据
这是最常见的需求,比如删除30天前的日志数据:
bash复制#!/bin/bash
ES_HOST="http://localhost:9200"
INDEX_NAME="app-logs-*"
QUERY='{
"query": {
"range": {
"@timestamp": {
"lt": "now-30d/d"
}
}
}
}'
response=$(curl -s -X POST "$ES_HOST/$INDEX_NAME/_delete_by_query" \
-H "Content-Type: application/json" \
-d "$QUERY")
# 检查执行结果
if echo "$response" | jq -e '.failures | length == 0' > /dev/null; then
echo "删除成功,共删除 $(echo "$response" | jq '.deleted') 条记录"
else
echo "删除失败:"
echo "$response" | jq '.failures'
fi
3.2 删除整个索引
对于临时索引或确定不再需要的数据,可以直接删除整个索引:
bash复制#!/bin/bash
ES_HOST="http://localhost:92
