📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-8.x

1. 错误异常的基本描述 #

field [{}] missing 属于解析阶段异常。根据保留代码,这里并不是泛指任意 mapping 字段不存在,而是在解析地理点结构时,发现某个必填字段缺失,例如 latlontypecoordinates 只传了一半。

常见现象 #

  • 写入 geo_point、解析 GeoJSON 或地理查询参数时立即报 400
  • 日志会明确点出缺少的是哪个字段。
  • 常见于不同 geo 表示法混用,例如把 lat/lontype/coordinates 结构混在一起。

2. 为什么会发生这个错误 #

  • 传了 lat 但没传 lon,或者反过来。
  • 使用 GeoJSON 结构时缺少 typecoordinates
  • 同时混入多种 geo 表示法,导致解析器无法判断完整结构。
  • 模板或程序在生成地理对象时漏掉了一个字段。

3. 排查步骤 #

  1. 检查请求体中的 geo 字段是采用 lat/lon 还是 type/coordinates 表示法。
  2. 确认同一个对象内没有混用两种不同表示法。
  3. 对照异常里点名的字段,检查是否被上游逻辑条件性省略。
  4. 如果来自程序拼装,打印最终 JSON 而不是只看变量值。
  5. 用最小合法 geo 对象在测试环境复现,确认问题仅在字段缺失。

4. 修复建议 #

  • lat/lon 必须成对出现。
  • 使用 GeoJSON 时至少保证 typecoordinates 同时存在且结构正确。
  • 不要在同一个地理对象里混用不同表示法。
  • 为地理字段生成逻辑增加完整性校验,避免半成品对象进入请求。

5. 小结 #

这个异常的重点不是“索引里缺少某个 mapping 字段”,而是 当前提交的地理对象本身不完整。只要把 geo 结构补齐,问题通常立刻消失。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

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) {