Elasticsearch更新失败:非目标字段类型不兼容如何查询及批量修复
Elasticsearch 字段类型不兼容问题排查与修复方案
检索异常文档
你可以通过Painless脚本查询快速定位所有字段类型和定义不匹配的文档,针对date字段存储float值的场景,查询语句如下:
GET /<your_index_name>/_search { "query": { "script": { "script": { "source": """ // 替换为实际需要校验的date字段名 def field = doc['createdDate']; if(field.size() == 0) return false; return field.value instanceof Number; """, "lang": "painless" } } } }
如果需要同时校验多个字段,在脚本中追加对应字段的判断逻辑即可,返回结果内的所有文档均存在date字段存储数值类型的异常问题。
批量修复异常字段
使用_update_by_query接口可以批量格式化所有异常字段的取值,无需单独操作单条文档,示例语句如下:
POST /<your_index_name>/_update_by_query { "query": { "script": { "script": { "source": """ def field = doc['createdDate']; if(field.size() == 0) return false; return field.value instanceof Number; """, "lang": "painless" } } }, "script": { "source": """ // 若字段存储的是秒级时间戳,需要先乘以1000再转long,匹配date字段的时间精度要求 long time_val = (long) ctx._source.createdDate; ctx._source.createdDate = time_val; """, "lang": "painless" } }
注意事项
- 数据量较大时可以添加参数
wait_for_completion=false让任务异步执行,避免接口超时 - 全量执行前建议先添加
size:10参数测试少量数据,验证转换逻辑符合预期后再全量运行 - 修复完成后,Elasticsearch全文档类型校验将不再触发非目标更新字段的类型不兼容报错,后续文档更新操作可正常执行
内容的提问来源于stack exchange,提问作者David Shemian
相关产品推荐
相关产品推荐

