注: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
有了更深地理解,因此我将解决该问题的过程记录了下来。
首先,由于是没有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
的问题。
由于ElasticSearch
允许在创建索引时就创建mapping
信息,于是我想到了这个方法,经过测试后,可以解决all shards failed
的问题。但是,产生了一个严重的后果,我们用.alert
索引来记录服务器报警信息,当我往.alert
这个索引里添加数据时,只有timestamp
这个字段的数据添加进去了,其他数据像产生报警的主机、报警内容等信息添加失败。
查询官方文档发现:
mapping
信息一旦被创建,就不允许被修改。改变已有的mapping
就意味着使已经存在的索引数据无效,解决的办法就是使用正确的mappings
信息来创建新的索引,然后重新把数据添加到新索引中。虽然官方提供了reindex
方法来解决这个问题,但是,在大数据量的情况下,reindex
代价比较高,因此,创建索引时添加mapping
这个方法也行不通。
ElasticSearch
的search api
可以设置排序时忽略字段的哪些映射。默认情况下,如果没有与排序字段关联的映射,则搜索请求将失败。unmapped_type
选项允许设置忽略没有映射的字段,从而不对该字段排序。由于timestamp
的mapping
为date
类型,因此,在搜索排序条件中增加{"timestamp":{"unmapped_type":"date"}}
成功解决由于排序字段没有date
映射引起的all shards failed
问题。
索引模板官方文档:Index Templates
索引排序官方文档:Sort
更新已存在的mapping
信息官方文档:updating_existing_mappings
stackoverflow
问题链接:No mapping found for field in order to sort on in ElasticSearch
Original url: Access
Created at: 2018-10-18 11:51:01
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论