Elasticsearch 报 "SearchPhaseExecutionException: all shards failed" 怎么解决?
ES 报 all shards failed 通常因为字段类型不匹配(text 上做聚合/排序)、分片分配失败或查询语法错误。本文给出常见原因和排查步骤。
这个错误表示查询在所有分片上执行失败。最常见原因:对 text 类型字段做排序/聚合/精确匹配(应该用 .keyword 子字段),或字段类型与查询不匹配。分片未分配(UNASSIGNED)也会导致。
常见原因一:text 字段上排序/聚合
// 错误:message 是 text 类型,不能排序
{ "sort": [{ "message": "desc" }] }
// 正确:用 keyword 子字段
{ "sort": [{ "message.keyword": "desc" }] }
ES 的错误详情里通常有 Fielddata is disabled on text fields——这就是原因。
常见原因二:字段类型与查询不匹配
// 对 text 字段用 term(精确匹配)往往查不到
{ "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
磁盘水位(默认 85% 限制)、节点不足都会让分片无法分配。
查看具体错误
完整报错信息的 caused_by 部分会写明具体原因——先看那一行,比盲目排查快。
观测云对照
观测云日志平台不需要用户管理分片和 mapping,字段类型自动识别、检索聚合开箱即用,避免这类 ES 运维问题。
常见问题(FAQ)
Q:如何启用 text 字段的 fielddata?
A:可以但不推荐(占用大量堆内存)。正确做法是索引 mapping 中给该字段加 keyword 子字段,重建索引。
Q:Kibana 里报错但 Dev Tools 里同样的查询能跑?
A:Kibana 可能对索引模式中不存在的字段做了操作,先刷新 Data View 的字段列表。
Q:error 日志显示 out of memory?
A:字段基数太高(如聚合 request_id),或 fielddata 占用过多。优化查询或减少聚合字段。