Elasticsearch升级后查询报错:All shards Failed及Failed to create query
问题分析与解决方案
核心报错原因
- 查询范围错误:执行的
GET /_search会遍历集群所有索引,包括Kibana系统索引(.kibana_1、.kibana_task_manager),这些索引不存在positions字段,因此触发"找不到嵌套对象"的错误。 - 字段类型不匹配:业务索引
My_Index_For_ES、My_Index_For_ES2中,positions字段并非nested类型,但使用了nested查询语法,导致类型不匹配报错。
分步解决
1. 限定查询目标索引
将查询范围改为仅针对业务索引,避免查询无关的系统索引:
GET /My_Index_For_ES,My_Index_For_ES2/_search { "query": { "bool": { "must": [ { "term": { "languageSkills.languageId": "10" } } ], "must_not": [ { "term": { "RemoveFromPositions": "Guid_Value_Here" } }, // 后续调整此处的查询逻辑,见下文 { "nested": { "path": "positions", "query": { "bool": { "must": [ { "term": { "positions.PositionID": "Guid_Value_here" } } ] } } } } ] } } }
2. 修正positions字段的查询逻辑
根据positions字段的实际类型调整查询:
情况A:positions是普通对象/数组类型
如果positions只是普通的对象或数组(未设置为nested类型),直接使用普通term查询替代nested查询:
GET /My_Index_For_ES,My_Index_For_ES2/_search { "query": { "bool": { "must": [ { "term": { "languageSkills.languageId": "10" } } ], "must_not": [ { "term": { "RemoveFromPositions": "Guid_Value_Here" } }, { "term": { "positions.PositionID": "Guid_Value_here" } } ] } } }
情况B:需要nested查询的功能
如果需要对数组中的每个对象进行独立匹配(比如避免跨对象的字段匹配),则需要先修改业务索引的映射,将positions设为nested类型:
- 先查看当前索引的映射,确认
positions类型:
GET /My_Index_For_ES/_mapping
- 修改索引映射(需先关闭索引,修改后重新打开,或创建新索引并迁移数据):
PUT /My_Index_For_ES/_mapping { "properties": { "positions": { "type": "nested", "properties": { "PositionID": { "type": "keyword" } // 其他字段按实际情况定义 } } } }
- 重新导入数据后,即可正常使用原有的
nested查询语法。
注意事项
- Elasticsearch升级后对查询的兼容性校验更严格,跨索引查询时若存在字段不匹配的情况,会直接报错而非忽略。
- 日常查询务必指定目标索引,避免使用
/_search遍历所有索引,减少不必要的错误。
内容的提问来源于stack exchange,提问作者Code Noob
相关产品推荐
相关产品推荐

