Elasticsearch Reindex API如何保留目标索引映射并删除嵌套字段
问题根因
重索引时目标索引映射被自动修改,是因为默认配置下ES开启了动态映射,而你迁移的_source中包含未在目标索引中定义的foo.baz字段,ES自动将该字段补充到了映射中。
嵌套字段的实现方案
方案1:通过_source参数过滤嵌套字段
ES的_source参数支持includes和excludes语法,可以精准控制嵌套层级的字段是否迁移:
如果你仅需要排除foo.baz、保留其他所有字段,直接配置排除规则即可:
{ "source": { "index": "my-index-0", "_source": { "excludes": ["foo.baz"] } }, "dest": { "index": "my-index-1" } }
如果需要保留的字段较少,也可以主动指定需要迁移的嵌套字段:
{ "source": { "index": "my-index-0", "_source": { "includes": ["foo.fizz", "其他需要保留的字段路径"] } }, "dest": { "index": "my-index-1" } }
方案2:关闭目标索引动态映射(保险配置)
如果需要严格控制目标索引的映射结构,避免任何未定义字段被自动加入,可以在创建新索引时将dynamic属性设为false:
{ "mappings": { "doc": { "dynamic": false, "properties": { "foo": { "properties": { "fizz": { "type": "keyword" } } } } } } }
该配置下,就算_source中携带了未定义的字段,也只会将字段内容存入_source,不会修改索引映射。如果需要完全禁止未定义字段写入,可以将dynamic设为strict,此时写入携带未定义字段的文档会直接报错,方便提前发现问题。
内容的提问来源于stack exchange,提问作者Paweł Rubin
相关产品推荐
相关产品推荐

