适用版本: 6.8-8.x
1. 错误异常的基本描述 #
field [{}] missing 属于解析阶段异常。根据保留代码,这里并不是泛指任意 mapping 字段不存在,而是在解析地理点结构时,发现某个必填字段缺失,例如 lat、lon、type 或 coordinates 只传了一半。
常见现象 #
- 写入 geo_point、解析 GeoJSON 或地理查询参数时立即报
400。 - 日志会明确点出缺少的是哪个字段。
- 常见于不同 geo 表示法混用,例如把
lat/lon和type/coordinates结构混在一起。
2. 为什么会发生这个错误 #
- 传了
lat但没传lon,或者反过来。 - 使用 GeoJSON 结构时缺少
type或coordinates。 - 同时混入多种 geo 表示法,导致解析器无法判断完整结构。
- 模板或程序在生成地理对象时漏掉了一个字段。
3. 排查步骤 #
- 检查请求体中的 geo 字段是采用
lat/lon还是type/coordinates表示法。 - 确认同一个对象内没有混用两种不同表示法。
- 对照异常里点名的字段,检查是否被上游逻辑条件性省略。
- 如果来自程序拼装,打印最终 JSON 而不是只看变量值。
- 用最小合法 geo 对象在测试环境复现,确认问题仅在字段缺失。
4. 修复建议 #
lat/lon必须成对出现。- 使用 GeoJSON 时至少保证
type和coordinates同时存在且结构正确。 - 不要在同一个地理对象里混用不同表示法。
- 为地理字段生成逻辑增加完整性校验,避免半成品对象进入请求。
5. 小结 #
这个异常的重点不是“索引里缺少某个 mapping 字段”,而是 当前提交的地理对象本身不完整。只要把 geo 结构补齐,问题通常立刻消失。
相关错误 #
- geo-polygon-unexpected-token-type-token-name:geo_polygon 中出现非法 token
- missing-location:仓库缺少 location 配置
- failed-to-parse-object-expected-start-object-but-was:对象解析失败
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
if (lat || lon || type || coordinates) {
throw new ElasticsearchParseException(invalidFieldsMessage);
}
} else if (found.size() == 0) {
if (lat) {
throw new ElasticsearchParseException("field [{}] missing"; LONGITUDE);
} else if (lon) {
throw new ElasticsearchParseException("field [{}] missing"; LATITUDE);
} else if (coordinates) {
throw new ElasticsearchParseException("field [{}] missing"; TYPE);
} else if (type) {





