ES查询不存在的索引,索引未创建导致查询报错


项目中的一个es索引是根据时间建立的,在对其操作时候,因时间原因此索引为创建,查询时候报如下错误:
[Elasticsearch exception [type=index_not_found_exception, reason=no such index [xxx_xxx_xxx_202206]]]
可以看到报错原因是因为此索引未发现,不存在。网上查了没找到具体做法,有方法是在查询时候判断是否存在的。但是我们想要的是, 怎样在查询时候忽略不存在的index

继续向下看报错:
在请求的URL里面有这样一条信息,il_searcthonre. filter shard size-12@htyped keys=truelana_concurent _shard_reuests=5&ignore_unavailable=falsehexpand wildcard=openkallow_no_indiceset rue&ignore_throttled=true
我们细看下日志,发现这个参数&ignore_unavailable=false,字面意思是忽略不能够使用的,但是置为了false,也就是说不忽略,我们如果改为true呢?

在使用的RestHighLevelClient的API中,我们在设置SearchRequest请求中,有这样一个参数indicesOptions,表示索引选项,其中的值可以设置IndicesOptions配置。进入其中可以看到,有如下的一个注释提示:
在这里插入图片描述
翻译为:
忽略不可用索引、扩展通配符以打开索引并允许从通配符表达式解析索引(不返回错误)的索引选项。

可以看到使用此方法可以忽略不可用索引,具体代码如下

SearchRequest searchRequest = new SearchRequest(indexName);
SearchRequest.scroll(scroll);
 ...
 searchRequest.source(searchSourceBuilder);
 //忽略不可用的索引:如果查询的索引名不存在,则忽略(ignoreUnavailable=true)
searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());

或者,我们可以直接指定

searchRequest.indicesOptions(IndicesOptions.fromOptions(true,true,true,false));

其中的参数意思为:

ignore_unavailable :是否忽略不可用的索引
allow_no_indices:是否允许索引不存在
expandToOpenIndices :通配符表达式将扩展为打开的索引
expandToClosedIndices :通配符表达式将扩展为关闭的索引

综上,此bug解决完毕。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐