包含数组对象的NDJSON文件导入Elasticsearch失败问题咨询
问题成因
- 不符合Elasticsearch Bulk API的NDJSON格式规范:Bulk接口要求每一条数据对应两行NDJSON,第一行是包含
_index、操作类型等信息的元数据行,第二行才是文档内容,你提供的文件仅包含文档内容行,缺少必要的元数据,ES无法完成解析。 - 文档顶级键动态不统一:每条数据的顶级键是
uyt、khg这类无规律的动态字段,如果你使用Kibana可视化导入工具,自动解析器识别不到统一的可映射字段结构,就会返回空白页面。 - 嵌套数组无提前映射:如果没有预先给索引创建映射,ES默认的动态映射不会自动把嵌套数组拆分为独立可检索的结构,甚至会出现字段类型冲突,导致导入失败。
解决方法
分两种常见使用场景选择对应方案:
场景1:保留现有结构,将每行NDJSON作为独立文档导入
- 第一步:补全元数据行,修改后的NDJSON格式参考如下:
{"index": {"_index": "自定义索引名", "_id": "1"}} {"uyt":[{"id": 28,"Title": "sdfg"}, {"id": 56,"Title": "rtwret"}]} {"index": {"_index": "自定义索引名", "_id": "2"}} {"khg":[{"id": 45,"Title": "sdfg"}, {"id": 5,"Title": "rtwret"}]} {"index": {"_index": "自定义索引名", "_id": "3"}} {"ihu":[{"id": 63,"Title": "iuy"}]} {"index": {"_index": "自定义索引名", "_id": "4"}} {"bvc":[{"id": 8,"Title": "hvhbi"}, {"id": 6,"Title": "kytd"}, {"id": 89,"Title": "resa"}]}
- 第二步:提前创建索引映射,将数组字段设为
nested类型避免类型冲突,创建请求参考:
PUT /自定义索引名 { "mappings": { "properties": { "uyt": {"type": "nested"}, "khg": {"type": "nested"}, "ihu": {"type": "nested"}, "bvc": {"type": "nested"} } } }
- 第三步:调用Bulk接口导入,命令示例:
curl -H "Content-Type: application/x-ndjson" -XPOST "http://你的ES服务地址:9200/_bulk" --data-binary @修改后的文件名.ndjson
场景2:把数组内的每个对象作为独立文档导入
- 第一步:预处理原文件,拍平结构,将顶级动态键作为
category字段存入文档,转换后的格式参考:
{"index": {"_index": "自定义索引名"}} {"category": "uyt", "id": 28,"Title": "sdfg"} {"index": {"_index": "自定义索引名"}} {"category": "uyt", "id": 56,"Title": "rtwret"} {"index": {"_index": "自定义索引名"}} {"category": "khg", "id": 45,"Title": "sdfg"} {"index": {"_index": "自定义索引名"}} {"category": "khg", "id": 5,"Title": "rtwret"} {"index": {"_index": "自定义索引名"}} {"category": "ihu", "id": 63,"Title": "iuy"} {"index": {"_index": "自定义索引名"}} {"category": "bvc", "id": 8,"Title": "hvhbi"} {"index": {"_index": "自定义索引名"}} {"category": "bvc", "id": 6,"Title": "kytd"} {"index": {"_index": "自定义索引名"}} {"category": "bvc", "id": 89,"Title": "resa"}
- 第二步:直接通过Bulk接口或者Kibana文件导入工具导入转换后的文件即可。
内容的提问来源于stack exchange,提问作者perza
相关产品推荐
相关产品推荐

