You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Delete API删除指定日期范围内的Elasticsearch索引?

实现方案

注意:索引删除操作不可逆,执行前务必先运行预览模式确认待删除索引列表完全正确,避免误删数据。

实现思路

  • 校验输入的两个日期格式是否符合yyyy-mm-dd规范,同时保证起始日期早于结束日期
  • 遍历起始日期到结束日期之间的所有自然日,拼接生成符合abc-xyz-yyyy-mm-dd格式的索引名
  • 先校验索引是否真实存在,再调用Elasticsearch Delete API执行删除操作

完整Shell脚本实现

#!/bin/bash

# 按需修改为你的Elasticsearch服务地址
ES_HOST="http://127.0.0.1:9200"
# 索引固定前缀
INDEX_PREFIX="abc-xyz-"

# 校验输入参数
if [ $# -ne 2 ] && [ $# -ne 3 ]; then
    echo "用法: $0 <起始日期 yyyy-mm-dd> <结束日期 yyyy-mm-dd> [--confirm]"
    echo "示例1: $0 2024-01-01 2024-01-10  # 仅预览待删除索引,不执行删除"
    echo "示例2: $0 2024-01-01 2024-01-10 --confirm  # 确认执行删除"
    exit 1
fi

START_DATE=$1
END_DATE=$2
EXEC_DELETE=0
if [ "$3" == "--confirm" ]; then
    EXEC_DELETE=1
fi

# 校验日期格式合法性
date -d "$START_DATE" "+%Y-%m-%d" >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "错误:起始日期格式非法,要求为yyyy-mm-dd格式"
    exit 1
fi
date -d "$END_DATE" "+%Y-%m-%d" >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "错误:结束日期格式非法,要求为yyyy-mm-dd格式"
    exit 1
fi

# 校验日期顺序
START_TS=$(date -d "$START_DATE" +%s)
END_TS=$(date -d "$END_DATE" +%s)
if [ $START_TS -gt $END_TS ]; then
    echo "错误:起始日期不能晚于结束日期"
    exit 1
fi

echo "===== 索引日期范围:$START_DATE 至 $END_DATE ====="
CURRENT_TS=$START_TS
TO_DELETE=()

# 遍历日期生成索引列表
while [ $CURRENT_TS -le $END_TS ]; do
    CURRENT_DATE=$(date -d @$CURRENT_TS "+%Y-%m-%d")
    INDEX_NAME="${INDEX_PREFIX}${CURRENT_DATE}"
    # 检查索引是否存在
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${ES_HOST}/${INDEX_NAME}")
    if [ $HTTP_CODE -eq 200 ]; then
        TO_DELETE+=($INDEX_NAME)
        echo "匹配到存在的索引:$INDEX_NAME"
    fi
    # 日期加1天
    CURRENT_TS=$(($CURRENT_TS + 86400))
done

if [ ${#TO_DELETE[@]} -eq 0 ]; then
    echo "未找到符合条件的索引,程序退出"
    exit 0
fi

# 执行删除逻辑
if [ $EXEC_DELETE -eq 0 ]; then
    echo "===== 当前为预览模式,未执行删除,确认删除请添加 --confirm 参数 ====="
else
    echo "===== 开始执行删除 ====="
    for IDX in "${TO_DELETE[@]}"; do
        echo "正在删除:$IDX"
        # 如果ES有账号密码,在curl后添加 -u 用户名:密码 参数即可
        curl -X DELETE "${ES_HOST}/${IDX}"
        echo ""
    done
    echo "===== 所有匹配索引删除完成 ====="
fi

可选优化:批量删除

如果待删除的索引数量较多,可以拼接成批量删除请求减少调用次数,格式如下:
curl -X DELETE "${ES_HOST}/abc-xyz-2024-01-01,abc-xyz-2024-01-02,abc-xyz-2024-01-03"


内容的提问来源于stack exchange,提问作者coder2411

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:27:03