OpenSearch嵌套字典数组索引后仅保留首个键值对问题求助
问题:OpenSearch嵌套字典数组仅保留首个键值对
版本信息
相关组件版本:OpenSearch/Dashboard 2.19.1,Docker部署
问题描述
向OpenSearch索引添加包含嵌套字典数组的文档时,数组中每个字典仅保留首个键值对,其余字段丢失。
示例:
原始数据片段:
"all_documents": [ {"name": "name 1", "what_it_proves": "some proofs", "considered_by_court": true}, {"name": "name 2", "what_it_proves": "some proofs 2", "considered_by_court": true} ]
执行GET /lawsuits-index/_doc/1返回结果片段:
"all_documents": [ {"name": "name 1"}, {"name": "name 2"} ]
配置与代码
数据摄入管道
PUT /_ingest/pipeline/lawsuits-pipeline { "description": "An NLP ingest pipeline", "processors": [ { "text_embedding": { "model_id": "NoBQUpYBM4rIdaEKP-bj", "field_map": { "court_decision": "passage_embedding" } } } ] }
索引创建语句
PUT /lawsuits-index { "settings": { "index.knn": true, "default_pipeline": "lawsuits-pipeline" }, "mappings": { "properties": { "judge_names": { "type": "text" }, "case_tags": { "type": "text" }, "claims": { "type": "text" }, "all_documents": { "type": "nested", "properties": { "name": { "type": "text" }, "what_it_proves": { "type": "text" }, "considered_by_court" : { "type": "boolean" } } }, "key_documents": { "type": "nested", "properties": { "name": { "type": "text" }, "rationale": { "type": "text" }, "explanation" : { "type": "boolean" } } }, "parties" :{ "type": "object" }, "case_number": { "type": "text" }, "answer_type": { "type": "text" }, "court_name": { "type": "text" }, "court_decision": { "type": "text" }, "passage_embedding": { "type": "knn_vector", "dimension": 768, "space_type": "l2" } } } }
待索引文档
PUT /lawsuits-index/_doc/1 { "case_number": "А53-40279/24", "answer_type": "case_data", "court_name": "Арбитражный суд Ростовской области", "judge_names": ["Кривоносовая О.В."], "parties": {"plaintiff": ["Замалаев Павел Сергеевич"], "defendant": ["Отдел записи актов гражданского состояния Администрации города Новочеркасска Ростовской области"]}, "claims": ["признание недействительным ненормативного правового акта", "обязанность предоставить сведения"], "court_decision": "Признать недействительным отказ Отдела ЗАГСа Администрации города Новочеркасска Ростовской области в представлении сведений конкурсному управляющему ООО «Гарантия» Замалаеву П.С., выраженный в письме от 19.07.2024 года № 58/723.", "all_documents": [ {"name": "Решение Арбитражного суда города Москвы от 30.09.2021 по делу №А40-51398/20-70-88 Б", "what_it_proves": "ООО «Гарантия» признано несостоятельным (банкротом)", "considered_by_court": true}, {"name": "Определение Арбитражного суда города Москвы от 19.01.2023 по делу №А40-51398/20-70-88 Б", "what_it_proves": "Конкурсным управляющим назначен Замалаев Павел Сергеевич", "considered_by_court": true}, {"name": "Ответ Отдела ЗАГС г. Новочеркасска Ростовской области № 58/723 от 19.07.2024 года", "what_it_proves": "Отказ в представлении сведений конкурсному управляющему ООО «Гарантия» Замалаеву П.С.", "considered_by_court": true}, {"name": "Закон о банкротстве (Федеральный закон от 26.10.2002 № 127-ФЗ)", "what_it_proves": "Право арбитражного управляющего на получение информации", "considered_by_court": true} ], "key_documents":[{ "name": "Ответ Отдела ЗАГС г. Новочеркасска Ростовской области № 58/723 от 19.07.2024 года", "rationale": "Отказ в представлении сведений конкурсному управляющему ООО «Гарантия» Замалаеву П.С.", "explanation": "Повлияло на решение суда"}, {"name": "Закон о банкротстве (Федеральный закон от 26.10.2002 № 127-ФЗ)", "rationale": "Право арбитражного управляющего на получение информации", "explanation": "Обоснование решения суда"} ], "claim_tags": ["признание недействительным ненормативного правового акта", "обязанность предоставить сведения"], "case_tags": ["банкротство", "конкурсное производство"] }
已尝试方案
- 使用动态映射
- 为嵌套对象、普通对象及
flat_object设置显式映射 - 将整个文档放入
flat_object结构
以上尝试均未解决问题,嵌套数组仍仅保留首个键值对。
问题原因与解决方案
核心原因
- 字段类型不匹配:
key_documents的explanation字段在映射中定义为boolean类型,但实际传入的文档中该字段值为字符串(如"Повлияло на решение суда")。OpenSearch遇到类型不匹配时,会忽略不符合类型的字段,极端情况下会导致整个嵌套对象的其他字段被异常截断。 - 潜在映射冲突:若在手动创建索引前已插入过文档,OpenSearch会自动生成动态映射,后续手动创建的映射可能无法覆盖原有配置,导致字段处理异常。
解决方案
修正字段类型匹配:
- 方法一:修改
key_documents的映射,将explanation字段类型改为text:"key_documents": { "type": "nested", "properties": { "name": {"type": "text"}, "rationale": {"type": "text"}, "explanation" : {"type": "text"} } } - 方法二:将文档中
explanation字段的值改为boolean类型(如true/false),匹配映射定义。
- 方法一:修改
重建索引:
- 删除现有索引:
DELETE /lawsuits-index - 重新创建修正后的索引映射
- 重新插入文档
- 删除现有索引:
验证摄入管道(可选):
暂时移除索引的default_pipeline配置,重新插入文档,确认是否是摄入管道导致的异常。若恢复正常,需检查text_embedding处理器是否存在隐含的字段过滤逻辑。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

