前言

注: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异常相关推荐

  1. Java操作es 查询时 [search_phase_execution_exception] all shards failed

    co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_ex ...

  2. Elasticsearch 7.2.0 搜索时报 all shards failed 错误

    问题描述: 通过ElasticSearch搜索时,当搜索的内容过长(大概25个汉字以上)时,会莫名其妙的报错,Elasticsearch exception [type=search_phase_ex ...

  3. [Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]

    现象 在做某一次用到elasticsearch的地位位置搜索时,报错: ElasticsearchStatusException[Elasticsearch exception [type=searc ...

  4. 解决Elasticsearch报错:exception [type=search_phase_execution_exception, reason=all shards failed]

    关于exception [type=search_phase_execution_exception, reason=all shards failed]这个es错误我是如何解决的! 由于服务器性能不 ...

  5. 【Elasticsearch】all shards failed no shard available for get .xxx[doc] routing null

    1.背景 es不知道什么原因突然挂了,然后后台日志信息如下 该错误是和 [elasticsearch]xpack exporter failed to flush export bulks 这个错误一 ...

  6. Elasticsearch数据库all shards failed

    Elasticsearch数据库all shards failed 背景 代码 报错 字段属性 背景 用es数据库来根据区域查询数据,有根据圆形区域和矩形区域. 代码 根据圆形区域范围内的车辆信息. ...

  7. elasticsearch报错 all shards failed修复

    启动后查看日志报错all shards failed 1.查看健康状态 [root@iZbp1bzugfiorbfrhd333aZ ~]# curl -XGET 'http://172.16.163. ...

  8. elasticsearch 出现 All shards failed for phase:问题解决过程

    运行es是报错:All shards failed for phase 运行命令:查看所有的index的状态,发现都是yellow curl -XGET 'http://127.0.0.1:9200/ ...

  9. ES 查询时提示:all shards failed [type=search_phase_execution_exception]

    我的情况和解决方案 这种错误大概率是 ES 的查询语句语法错误,比如我当时是,时间筛选的条件的格式写错了,导致 ES 查询时解析错误,从而报了all shards failed [type=searc ...

最新文章

  1. linux默认csh修改命令,Solaris中默认Shell的修改以及命令行补全的设置
  2. DOM的appendchild在IE6、7下不兼容
  3. 如何在Mac下显示Finder中的所有文件
  4. HTTP流媒体播放技术发展以及nginx点播源站
  5. Scala控制抽象:将一段代码作为参数传递给高阶函数去执行
  6. caffe loss一直nan什么情况
  7. Force.com 多租户架构
  8. 抛弃 VS Code 我还能用啥编辑器?| 技术头条
  9. 微型计算机的逻辑元素,微机原理及应用 宋廷强 微型计算机原理及应用.ppt
  10. 河南省学业水平测试计算机题目,2015级河南学业水平考试试题及答案
  11. 2006年中国首届杰出数据库工程师评选面试实录
  12. 华为转正答辩ppt范文_华为新员工转正答辩
  13. TriangleCount三角形计数
  14. What is base..ctor(); in C#?
  15. len计算机语言,python中len的使用方法
  16. B - 阿克曼函数(记忆化搜索(啊呸))
  17. 一个公务员工作七年后的肺腑之言
  18. Securing Wireless LANs with PEAP and Passwords
  19. 【Redshift渲染器渲染出图片有色差(红移渲染器)】
  20. 数据研发工程师面试全过程(个人面试)

热门文章

  1. 速卖通电脑办公行业什么产品好卖?解读2022速卖通重点招商品类及营销策略
  2. 分享一个网站地图生成工具
  3. 鸿蒙OS应用(HarmonyOS Application)开发常见示例源码
  4. 如何使用计算机创电子表格,计算机如何创建表格?
  5. PowerMill 2018三五轴编程+后处理制作视频教程
  6. 学习juca:Striped64(1.8)
  7. Android 自定义锁屏_三星Key Cafe 2021最新版下载-三星Key Cafe自定义键盘输入app v1.0.00.26...
  8. 关于NC6.X企业报表取不了数的问题及其解决方法。
  9. 边旅游边工作是一种什么样的感受
  10. 转:英语 表示字母、数字的复数