Python Elasticsearch es.index与es.indices.create索引映射不一致问题
两种API生成映射不一致的原因
两个API的设计定位完全不同,运行逻辑差异如下:
es.indices.create()是专门用于创建Elasticsearch索引的接口,你传入的包含settings、mappings的配置会被ES直接识别为索引元数据,按照你定义的结构生成分片规则、字段映射,最终结果和预期一致。es.index()是专门用于往指定索引写入文档数据的接口,本身没有配置索引元数据的能力。你调用时把整个索引映射配置当成了document参数传入,ES检测到my_index不存在时会自动创建索引,同时根据你传入的文档内容触发动态映射:你传入的文档本身就包含mappings、properties层级的字段,ES会把这些字段当成普通的业务字段一层层生成映射规则,最终就出现了多层嵌套的异常结构。
用es.index实现预期自定义映射的方法
首先明确:es.index本身不支持直接配置索引映射,标准流程下建议优先用es.indices.create()提前创建索引、配置映射后再写入数据。如果一定要在调用es.index写入数据时得到预期的映射效果,按以下步骤操作:
- 写入文档前先判断目标索引是否存在,如果不存在,先调用
es.indices.create()或者es.indices.put_mapping()完成自定义映射配置。 - 调用
es.index()写入业务数据,注意此时document参数传入的是实际业务数据,不要传入索引配置的my_mapping内容。
内容的提问来源于stack exchange,提问作者tuatara
相关产品推荐
相关产品推荐

