Elasticsearch查询多个索引时,如果其中某个索引不存在或close,则该查询直接返回 ”404 索引丢失“ 错误
如:
GET /ocslog-2016.08.03,ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_search
假如:ocslog-2016.08.03不存在,则将直接返回:
{
"error": "IndexMissingException[[ocslog-2016.08.03] missing]",
"status": 404
}
这时,可以先调用下面这个api,检查索引是否存在
GET /ocslog-2016.08.03,ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_alias
返回:
{
"ocslog-2016.08.05": {
"aliases": {}
},
"ocslog-2016.08.06": {
"aliases": {}
},
"ocslog-2016.08.04": {
"aliases": {}
}
}
说明:存在三个索引
再次执行:
GET /ocslog-2016.08.04,ocslog-2016.08.05,ocslog-2016.08.06/_search
如果,这三个索引中 ocslog-2016.08.04 索引是close状态的,将返回:
{
“error”: “IndexClosedException[[ocslog-2016.08.04] closed]”,
“status”: 403
}
这时,可以再调用下面的api,检查索引的状态
GET /_cat/indices/ocslog-2016.08.04,ocslog-2016.08.05,cdr-2015-02-26?v
返回:
health status index pri rep docs.count docs.deleted store.size pri.store.size
green open ocslog-2016.08.05 1 1 2 0 17.2kb 8.6kb
green open ocslog-2016.08.06 1 1 13 0 25.3kb 12.6kb
close ocslog-2016.08.04
分析下这个返回结果,可以过滤掉 close 的索引
最后得到二个可以正确 _search 的索引:
GET /ocslog-2016.08.05,ocslog-2016.08.06/_search
正常查询出结果
其实 kibana 的查询就是这样处理的,不过kibana没有过滤 close 的索引,如果查询索引中有 close 状态的索引,将返回失败,查询不到任何结果