You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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:遇到未定义字段直接拒绝写入

两种映射结构的差异说明

你现在生成的结构和预期的结构功能完全等效,没有任何行为差异:

  1. Elasticsearch中object是对象字段的默认类型,你预期的结构里省略了"type": "object"属于简化写法,ES解析映射的时候会自动补全该默认配置。
  2. dynamic: true(布尔值)和dynamic: "true"(字符串)在ES的配置解析逻辑中是完全等效的,不会产生运行差异。
  3. properties: {}是对象字段的默认属性,当你没有给attributes配置任何预定义子字段时,ES会自动生成空的properties属性,即使映射中没有显式写出,运行时也会生效。

生成符合预期结构的调整方法

如果需要在生成的映射中显式带出properties: {},只需要在定义Object字段时显式传入空的properties参数即可:

class RetailerProductGeneric(Document):
    product_id = Keyword()
    attributes = Object(
        dynamic=True,
        properties={}  # 显式声明空属性,生成映射时会带出properties: {}
    )

内容的提问来源于stack exchange,提问作者Ojas Kale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:45:00