Elasticsearch 报 "SearchPhaseExecutionException: all shards failed" 怎么解决?
ES 报 all shards failed 通常因为字段类型不匹配(text 上做聚合/排序)、分片分配失败或查询语法错误。本文给出常见原因和排查步骤。
SearchPhaseExecutionException 是搜索阶段失败的包装异常,本身不一定表示所有分片都失败;若同时明确显示 all shards failed,则表示此次搜索所涉分片均失败,应检查具体原因和 failed_shards。最常见原因:对 text 类型字段做排序/聚合(应该用 .keyword 子字段),或字段类型与查询不匹配。相关主分片不可用也可能导致失败;仅副本未分配不意味着查询不可用。
常见原因一:text 字段上排序/聚合
// 错误:message 是 text 类型,不能排序
{ "sort": [{ "message": "desc" }] }
// 正确:用 keyword 子字段
{ "sort": [{ "message.keyword": "desc" }] }
ES 的错误详情里通常有 Fielddata is disabled on text fields——这就是原因。
常见原因二:字段类型与查询不匹配
// term查询的是索引词项,可能查不到原文;零结果本身不是search_phase_execution_exception
{ "term": { "message": "error" } } // 可能无结果
// text 字段用 match(分词匹配)
{ "match": { "message": "error" } }
// 或用 keyword 子字段精确匹配
{ "term": { "level.keyword": "ERROR" } }
常见原因三:分片分配失败
# 查看分片状态
curl localhost:9200/_cat/shards?v | grep -v STARTED
# 查看未分配原因
curl localhost:9200/_cluster/allocation/explain?pretty
磁盘有 low/high/flood-stage 等不同水位,还受字节阈值与max_headroom影响;按实际版本配置和 allocation explain 判断,不是统一85%阈值。
查看具体错误
完整报错信息的 caused_by 部分会写明具体原因——先看那一行,比盲目排查快。
常见问题(FAQ)
Q:如何启用 text 字段的 fielddata?
A:可以但不推荐(占用大量堆内存)。通常使用实际存在的 keyword 字段;新增 multi-field 后历史文档不会自动填充,需更新或重建索引。
Q:Kibana 里报错但 Dev Tools 里同样的查询能跑?
A:比较完整查询、时间窗口、目标索引与权限,并用 _field_caps 检查混合mapping;刷新字段列表不保证解决查询执行失败。
Q:error 日志显示 out of memory?
A:字段基数太高(如聚合 request_id),或 fielddata 占用过多。优化查询或减少聚合字段。