如何使用elasticsearch_dsl创建带动态properties的Elasticsearch映射
官方示例代码含义说明
你看到的官方示例是在文档全局级别配置动态映射规则:
class Post(Document): title = Text() class Meta: all = MetaField(enabled=False) dynamic = MetaField('strict')
all = MetaField(enabled=False):作用是禁用Elasticsearch旧版本的_all元字段(7.x及以后版本该字段默认已禁用,该配置主要用于兼容低版本逻辑)。_all字段会将文档所有字段的内容拼接为一个字符串做索引,关闭后可以节省存储和索引开销。dynamic = MetaField('strict'):设置整个文档的动态映射策略为严格模式,此时如果写入的文档包含映射中未定义的字段,会直接抛出写入失败的错误,避免脏字段入库。
动态映射策略共有三个可选值:
true:自动将新字段添加到映射中,新字段可被正常检索false:新字段不会被添加到映射,仅保存在_source中,无法通过该字段搜索strict:遇到未定义字段直接拒绝写入
两种映射结构的差异说明
你现在生成的结构和预期的结构功能完全等效,没有任何行为差异:
- Elasticsearch中
object是对象字段的默认类型,你预期的结构里省略了"type": "object"属于简化写法,ES解析映射的时候会自动补全该默认配置。 dynamic: true(布尔值)和dynamic: "true"(字符串)在ES的配置解析逻辑中是完全等效的,不会产生运行差异。properties: {}是对象字段的默认属性,当你没有给attributes配置任何预定义子字段时,ES会自动生成空的properties属性,即使映射中没有显式写出,运行时也会生效。
生成符合预期结构的调整方法
如果需要在生成的映射中显式带出properties: {},只需要在定义Object字段时显式传入空的properties参数即可:
class RetailerProductGeneric(Document): product_id = Keyword() attributes = Object( dynamic=True, properties={} # 显式声明空属性,生成映射时会带出properties: {} )
内容的提问来源于stack exchange,提问作者Ojas Kale
相关产品推荐
相关产品推荐

