如何在ElasticSearch中查询指定日期区间内的myindex-YYYY.MM.dd格式索引?
无需生成全量索引名的解决方案
嘿,这个问题我之前处理类似场景时也碰到过——日期数学搞不定跨月跨年的长区间,列全索引名又怕请求超长甚至触发GET长度限制。给你几个实用的思路,不用枚举所有索引名就能搞定:
1. 给目标区间索引绑定临时别名(最推荐)
这是最省心的方案,一次性操作后后续查询直接用别名就行,完全不用管具体索引名:
- 先筛选出2017.03.10至2018.01.25区间内的索引(可以用
_cat/indices或者写个简单脚本过滤) - 执行批量别名绑定请求:
POST _aliases { "actions": [ { "add": { "index": "myindex-2017.03.10", "alias": "myindex-20170310-20180125" }, { "add": { "index": "myindex-2017.03.11", "alias": "myindex-20170310-20180125" } # 批量添加所有符合区间的索引,或者用脚本自动生成这个请求体 } ] } }
之后查询直接用myindex-20170310-20180125作为索引名,比如:
GET myindex-20170310-20180125/_search { "query": { "match_all": {} } }
如果需要频繁查询不同时间区间,可以写个小脚本(Python/Bash都可以),输入起止日期后自动筛选索引并生成别名绑定请求,全程自动化,不用手动操作。
2. 用精准的通配符索引模式
如果不想用别名,也可以构造更简洁的通配符模式,代替枚举所有日期:
比如针对你的区间,可以拆分成几个部分的通配符组合:
GET /myindex-2017.03.10*,myindex-2017.03.1[1-9]*,myindex-2017.03.2[0-9]*,myindex-2017.03.3[0-1]*,myindex-2017.04.*,myindex-2017.05.*,myindex-2017.06.*,myindex-2017.07.*,myindex-2017.08.*,myindex-2017.09.*,myindex-2017.10.*,myindex-2017.11.*,myindex-2017.12.*,myindex-2018.01.0[1-9]*,myindex-2018.01.1[0-9]*,myindex-2018.01.2[0-5]*/_search
这个模式比列几百个日期短很多,而且能精准匹配目标区间的索引,不会包含多余的索引。
3. 利用索引创建时间筛选(适合脚本化场景)
如果索引名里的日期和实际创建时间一致,还可以通过_cat/indices的创建时间字段筛选目标索引,再批量操作:
比如用Bash脚本实现:
# 筛选出创建时间在目标区间的索引名 TARGET_INDICES=$(curl -s "http://your-es-host:9200/_cat/indices/myindex-*?h=i,cd&v" | awk '$2 >= "2017-03-10" && $2 <= "2018-01-25" {print $1}' | tr '\n' ',') # 移除最后一个逗号 TARGET_INDICES=${TARGET_INDICES%,} # 执行查询 curl -XGET "http://your-es-host:9200/$TARGET_INDICES/_search" -H "Content-Type: application/json" -d '{"query":{"match_all":{}}}'
这个方法适合需要临时查询一次的场景,不用创建别名,但如果索引数量极多,还是建议用别名避免请求过长。
内容的提问来源于stack exchange,提问作者trd3v3lop
相关产品推荐
相关产品推荐

