ElasticSearch排序引起的all shards failed异常
前言
注:ElasticSearch版本为5.4。
在我们的日志系统里需要一些系统索引,这些系统索引在应用初始化的时候就会被添加到ElasticSearch中去,这些在ElasticSearch中的系统索引在没有索引数据的时候,只有索引名和一些配置信息,没有mapping信息。当用户去根据时间区间排序搜索日志信息的时候,ElasticSearch就会产生all shards failed异常。具体异常信息如下:
Caused by: [.alert/NXa3zq5WSb-wGBKgyZibzw] QueryShardException[No mapping found for [timestamp] in order to sort on]at org.ElasticSearch.search.sort.FieldSortBuilder.build(FieldSortBuilder.java:262)at org.ElasticSearch.search.sort.SortBuilder.buildSort(SortBuilder.java:156)at org.ElasticSearch.search.SearchService.parseSource(SearchService.java:617)at org.ElasticSearch.search.SearchService.createContext(SearchService.java:468)at org.ElasticSearch.search.SearchService.createAndPutContext(SearchService.java:444)at org.ElasticSearch.search.SearchService.executeQueryPhase(SearchService.java:252)at org.ElasticSearch.action.search.SearchTransportService$6.messageReceived(SearchTransportService.java:331)at org.ElasticSearch.action.search.SearchTransportService$6.messageReceived(SearchTransportService.java:328)at org.ElasticSearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:69)at org.ElasticSearch.transport.TransportService$7.doRun(TransportService.java:627)at org.ElasticSearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:638)at org.ElasticSearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)... 3 more
查看了.alert的索引数据再结合ElasticSearch的异常信息判断,我怀疑是由于.alert系统索引没有timestamp mapping信息引起的,.alert索引初始化没有任何数据时,ElasticSearch中的信息如下:
http://dev:9200/.alert
{".alert": {"aliases": {"alert": {}},"mappings": {"alert": {}},"settings": {"index": {"refresh_interval": "-1","number_of_shards": "5","provided_name": ".alert","creation_date": "1533613744728","store": {"type": "fs"},"number_of_replicas": "1","uuid": "YuPjsObOTMO6u3fEdG6hVw","version": {"created": "5040099"}}}}
}
看到这些信息之后,我开始了用以下方法尝试解决。
解决方法
以下方法1和方法2都以失败而告终,只有方法3可以成功解决该问题。但在解决问题中我查找了很多资料,让我对ElasticSearch的mapping有了更深地理解,因此我将解决该问题的过程记录了下来。
方法1:添加索引模板
首先,由于是没有timestamp这个mapping信息,因此我想到创建索引模板,将.alert这个索引的mappings信息用模板来设置,以便在索引创建的时候就有相应的mapping信息。模板信息如下:
{"alert": {"order": 0,"template": "alert","settings": {"index": {"number_of_shards": "5","number_of_replicas": "1","refresh_interval": "2s"}},"mappings": {"alert": {"properties": {"timestamp": {"type": "date"}}}},"aliases": {}}
}
但是,经过测试后发现,all shards failed的问题还是会产生。究其原因是由于:
索引模板只会在插入新索引数据的时候生效,如果没有索引数据,索引模板定义的mappings信息不会生效,而且对模板的改变不会影响到已存在的索引。
此时,.alert这个索引为空,还没有新数据插入,因此,模板不会生效,也就致使该方法不会解决all shards failed的问题。
方法2:创建索引时添加mapping
由于ElasticSearch允许在创建索引时就创建mapping信息,于是我想到了这个方法,经过测试后,可以解决all shards failed的问题。但是,产生了一个严重的后果,我们用.alert索引来记录服务器报警信息,当我往.alert这个索引里添加数据时,只有timestamp这个字段的数据添加进去了,其他数据像产生报警的主机、报警内容等信息添加失败。
查询官方文档发现:
mapping信息一旦被创建,就不允许被修改。改变已有的mapping就意味着使已经存在的索引数据无效,解决的办法就是使用正确的mappings信息来创建新的索引,然后重新把数据添加到新索引中。虽然官方提供了reindex方法来解决这个问题,但是,在大数据量的情况下,reindex代价比较高,因此,创建索引时添加mapping这个方法也行不通。
方法3:给排序条件加unmapped_type
ElasticSearch的search api可以设置排序时忽略字段的哪些映射。默认情况下,如果没有与排序字段关联的映射,则搜索请求将失败。unmapped_type选项允许设置忽略没有映射的字段,从而不对该字段排序。由于timestamp的mapping为date类型,因此,在搜索排序条件中增加{“timestamp”:{“unmapped_type”:“date”}}成功解决由于排序字段没有date映射引起的all shards failed问题。
ElasticSearch排序引起的all shards failed异常相关推荐
- Java操作es 查询时 [search_phase_execution_exception] all shards failed
co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_ex ...
- Elasticsearch 7.2.0 搜索时报 all shards failed 错误
问题描述: 通过ElasticSearch搜索时,当搜索的内容过长(大概25个汉字以上)时,会莫名其妙的报错,Elasticsearch exception [type=search_phase_ex ...
- [Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]
现象 在做某一次用到elasticsearch的地位位置搜索时,报错: ElasticsearchStatusException[Elasticsearch exception [type=searc ...
- 解决Elasticsearch报错:exception [type=search_phase_execution_exception, reason=all shards failed]
关于exception [type=search_phase_execution_exception, reason=all shards failed]这个es错误我是如何解决的! 由于服务器性能不 ...
- 【Elasticsearch】all shards failed no shard available for get .xxx[doc] routing null
1.背景 es不知道什么原因突然挂了,然后后台日志信息如下 该错误是和 [elasticsearch]xpack exporter failed to flush export bulks 这个错误一 ...
- Elasticsearch数据库all shards failed
Elasticsearch数据库all shards failed 背景 代码 报错 字段属性 背景 用es数据库来根据区域查询数据,有根据圆形区域和矩形区域. 代码 根据圆形区域范围内的车辆信息. ...
- elasticsearch报错 all shards failed修复
启动后查看日志报错all shards failed 1.查看健康状态 [root@iZbp1bzugfiorbfrhd333aZ ~]# curl -XGET 'http://172.16.163. ...
- elasticsearch 出现 All shards failed for phase:问题解决过程
运行es是报错:All shards failed for phase 运行命令:查看所有的index的状态,发现都是yellow curl -XGET 'http://127.0.0.1:9200/ ...
- ES 查询时提示:all shards failed [type=search_phase_execution_exception]
我的情况和解决方案 这种错误大概率是 ES 的查询语句语法错误,比如我当时是,时间筛选的条件的格式写错了,导致 ES 查询时解析错误,从而报了all shards failed [type=searc ...
最新文章
- linux默认csh修改命令,Solaris中默认Shell的修改以及命令行补全的设置
- DOM的appendchild在IE6、7下不兼容
- 如何在Mac下显示Finder中的所有文件
- HTTP流媒体播放技术发展以及nginx点播源站
- Scala控制抽象:将一段代码作为参数传递给高阶函数去执行
- caffe loss一直nan什么情况
- Force.com 多租户架构
- 抛弃 VS Code 我还能用啥编辑器?| 技术头条
- 微型计算机的逻辑元素,微机原理及应用 宋廷强 微型计算机原理及应用.ppt
- 河南省学业水平测试计算机题目,2015级河南学业水平考试试题及答案
- 2006年中国首届杰出数据库工程师评选面试实录
- 华为转正答辩ppt范文_华为新员工转正答辩
- TriangleCount三角形计数
- What is base..ctor(); in C#?
- len计算机语言,python中len的使用方法
- B - 阿克曼函数(记忆化搜索(啊呸))
- 一个公务员工作七年后的肺腑之言
- Securing Wireless LANs with PEAP and Passwords
- 【Redshift渲染器渲染出图片有色差(红移渲染器)】
- 数据研发工程师面试全过程(个人面试)
热门文章
- 速卖通电脑办公行业什么产品好卖?解读2022速卖通重点招商品类及营销策略
- 分享一个网站地图生成工具
- 鸿蒙OS应用(HarmonyOS Application)开发常见示例源码
- 如何使用计算机创电子表格,计算机如何创建表格?
- PowerMill 2018三五轴编程+后处理制作视频教程
- 学习juca:Striped64(1.8)
- Android 自定义锁屏_三星Key Cafe 2021最新版下载-三星Key Cafe自定义键盘输入app v1.0.00.26...
- 关于NC6.X企业报表取不了数的问题及其解决方法。
- 边旅游边工作是一种什么样的感受
- 转:英语 表示字母、数字的复数