在OpenSearch中按日期范围筛选索引的正确方法
如何按日期范围筛选OpenSearch索引?
我使用以下端点获取OpenSearch索引信息:
{{OPENSEARCH_ENDPOINT}}/_cat/indices?h=h,s,i,id,p,r,dc,dd,ss,creation.date.string
返回结果示例:
green open fluent-bit-2023.04 nA-VlnELTL2igAroKB0CuQ 5 1 487819 0 247.3mb 2023-04-01T00:00:00.324Z green open fluent-bit-2023.02 YL9re7_mR06td3gH3p3vlg 5 1 178616 0 106.3mb 2023-02-24T07:31:28.508Z green open fluent-bit-2023.03 ebnxgf2JQQCh4PKpyKIAqA 5 1 2512232 0 1.4gb 2023-03-01T00:00:00.199Z
我尝试用带请求体的_cat/indices请求按创建日期范围筛选,但没有成功:
curl -X GET "http://BASE_URL/_cat/indices/?v&s=index&pretty" --header "Content-Type:application/json" -d' { "query": { "bool": { "must": [ { "range": { "creation.date.string": { "gte": "2023-03-15", "lte": "2023-03-16" } } } ] } } }'
解决方案
首先明确:_cat/indices是文本格式的监控接口,不支持通过DSL请求体筛选索引,只能通过URL参数或事后处理结果实现需求,以下是两种可行方式:
方式一:用Shell工具直接筛选_cat/indices结果
因为_cat/indices返回的是结构化文本,可借助awk、grep等工具按日期字段过滤:
筛选指定日期区间(如2023-03-01至2023-03-31)
curl -s "{{OPENSEARCH_ENDPOINT}}/_cat/indices?h=h,s,i,id,p,r,dc,dd,ss,creation.date.string" | awk '$10 >= "2023-03-01" && $10 <= "2023-03-31T23:59:59.999Z"'
$10对应返回结果中第10列的creation.date.string字段(按你指定的h参数顺序)- ISO格式日期字符串可直接按字典序比较,与时间顺序一致
筛选精确某天(如2023-03-15)
curl -s "{{OPENSEARCH_ENDPOINT}}/_cat/indices?h=h,s,i,id,p,r,dc,dd,ss,creation.date.string" | grep "^[^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* 2023-03-15"
方式二:通过元数据API查询并筛选
如果需要更灵活的筛选逻辑,可借助_get_settings或_cluster/state获取索引元数据后处理:
使用_get_settings接口(仅获取索引名称)
curl -s "{{OPENSEARCH_ENDPOINT}}/_all/_settings?flat_settings=true" | jq 'to_entries[] | select(.value.index.creation_date | tonumber | strftime("%Y-%m-%d") >= "2023-03-15" and strftime("%Y-%m-%d") <= "2023-03-16") | .key'
_all/_settings获取所有索引的设置信息index.creation_date是时间戳格式,需转成日期字符串再比较- 最终输出符合条件的索引名称
使用_cluster/state接口(同时获取索引基础信息)
curl -s "{{OPENSEARCH_ENDPOINT}}/_cluster/state/metadata?pretty" | jq '.metadata.indices | to_entries[] | select(.value.creation_date | tonumber | strftime("%Y-%m-%d") >= "2023-03-15" and strftime("%Y-%m-%d") <= "2023-03-16") | {index: .key, creation_date: (.value.creation_date | tonumber | strftime("%Y-%m-%dT%H:%M:%SZ"))}'
原命令失败原因
_cat/indices接口仅用于输出文本格式的索引监控数据,不支持接收DSL查询请求体。DSL查询仅适用于文档数据的_search接口,无法用来筛选索引元数据。
内容的提问来源于stack exchange,提问作者Ayur Sharma
相关产品推荐
相关产品推荐

