Elasticsearch nested类型嵌套对象字段转数组问题排查
Elasticsearch Nested类型字段索引后格式疑问
问题背景
原始输入JSON:
{ "users" : [ { "first" : "John", "last" : "Smith" }, { "first" : "Alice", "last" : "White" } ] }
使用的映射片段:
"users": { "dynamic": false, "type": "nested", "properties": { "first": { "type": "text" }, "last": { "type": "text" } } }
索引后返回的结构:
"users": [ { "first": [ "John" ], "last": [ "Smith" ] }, { "first": [ "Alice" ], "last": [ "White" ] } ]
疑问:该行为是否符合预期?操作是否有误?如何让nested对象内的text字段保持单个值而非数组格式?目前搜索功能正常,但返回格式不符合预期,已尝试删索引、改映射、刷新索引、调整dynamic参数等操作,问题仍存在。
解答
该行为符合Elasticsearch设计逻辑
Elasticsearch中,text类型字段无论输入是单个字符串还是数组,内部都会以多值形式存储(适配倒排索引的分词需求),查询返回时会统一以数组格式展示。这只是展示层面的格式统一,实际存储的单个值并未被修改为数组结构,也不会影响搜索功能。你的映射配置没有错误
当前的nested类型映射是正确的:dynamic: false避免了自动新增字段,nested类型也确实保留了数组内的独立对象结构,搜索功能正常也验证了这一点。如何让返回格式符合预期
若必须返回单个字符串而非数组,可通过以下两种方式处理:- 改用
keyword类型:如果不需要对字段进行分词,仅需精确匹配,可将字段类型改为keyword,查询返回时会保持单个字符串格式。修改后的映射片段:"users": { "dynamic": false, "type": "nested", "properties": { "first": { "type": "keyword" }, "last": { "type": "keyword" } } } - 使用脚本字段处理返回结果:如果仍需要
text类型的分词能力,可在查询时通过脚本字段提取数组中的单个值返回,示例查询请求:{ "query": { "match_all": {} }, "script_fields": { "first": { "script": "doc['users.first'].value" }, "last": { "script": "doc['users.last'].value" } } }
注意:
text类型的默认返回格式就是数组,这是Elasticsearch为兼容多值场景做的统一处理,无法仅通过映射修改这个展示形式。- 改用
内容的提问来源于stack exchange,提问作者Aleks Kisel
相关产品推荐
相关产品推荐

