定义了一个名为delete_index
的函数,它接受一个索引名称列表作为参数,遍历列表并对每个索引执行如下操作:
indices.delete
方法删除该索引。定义了要删除的索引前缀列表prefixes
。
计算上一年的年份(基于当前日期),然后生成一个包含上一年所有月份的元组列表all_months
。
遍历all_months
中的每一对年份和月份,以及给定的前缀列表,构造符合指定格式的索引别名,并尝试获取对应的索引。若成功获取到索引,则调用delete_index
函数删除它们。
判断当前是否已超过今年的第一个月,如果是,则计算出今年的前几个月份,并执行与上述相同的删除逻辑。
总之,此段代码的目标是定期清理存储在Elasticsearch集群中按特定命名规则(如"cr-all-YYYY.MM."、"cr-in-YYYY.MM." 和 "cr-stat-YYYY.MM.*")组织的历史数据索引。
# -*- coding: utf-8 -*-
# @Time : 2024/1/5 10:23
# @Author : hjcui
# @Site :
# @File : Dele_ES_Index.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from elasticsearch import Elasticsearch
ips = [
'192.168.0.141',
'192.168.0.147',
'192.168.0.148',
'192.168.0.149',
'192.168.0.150'
]
port = '9200'
IP_Port = [f"{ip}:{port}" for ip in ips]
conn_dbs = Elasticsearch(IP_Port)
def delete_index(indexes):
for index_name in indexes:
if conn_dbs.indices.exists(index=index_name):
conn_dbs.indices.delete(index=index_name)
prefixes = ['cr-all', 'cr-in', 'cr-stat']
# 获取前一年的所有月份(包括闰年)
last_year = datetime.now().year - 1
all_months = [(last_year, m) for m in range(1, 13)]
# 删除上一年后半年以及前半年的索引
for year, month in all_months:
for prefix in prefixes:
index_pattern = f"{prefix}-{year}.{month:0>2}.*"
indices = conn_dbs.indices.get_alias(index=index_pattern)
# 使用items()判断非空字典更为简洁,但此处直接检查indices本身即可
if indices:
delete_index(indices.keys())
# 如果需要删除当前年的前几个月(例如1月至当前月),可以添加如下代码:
current_month = datetime.now().month
if current_month > 1:
for prefix in prefixes:
for i in range(1, current_month):
index_pattern = f"{prefix}-{datetime.now().year}.{i:0>2}.*"
indices = conn_dbs.indices.get_alias(index=index_pattern)
if indices:
delete_index(indices.keys())