Skip to content
📖0 阅读·🤍0 点赞

ES中Dynamic 参数故事版

dynamic

dynamic:控制是否可以动态添加新字段- true 新检测到的字段将添加到映射中。(默认)

false 新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍会出现在_source返回的匹配项中。这些字段不会添加到映射中,必须显式添加新字段。

Dynamic 参数:数字村的「城市规划局」 🏗️📜

想象数字村就像一个快速发展的城市,而 dynamic 参数就是城市规划局制定的土地开发政策,决定了新来的居民(字段)能否在村里自由建房:


三种城市规划政策

1. 自由开发区(dynamic: true)→ 默认政策

json
PUT free_city
{
  "mappings": {
    "dynamic": true   // 默认值,可省略
  }
}

政策特点:

  • 📍 新居民随意建房:新字段自动创建映射
  • 📍 自动颁发房产证:自动生成字段类型
  • 📍 即时开通水电:新字段可被搜索

操作演示:

json
// 首次插入新字段
PUT free_city/_doc/1
{
  "new_field": "自由建造"   // 自动创建text类型字段
}

// 立即可以搜索
GET free_city/_search
{
  "query": {"match": {"new_field": "自由"}}  // ✅ 能搜到
}

适用场景:开发测试环境、日志类灵活数据


2. 管控开发区(dynamic: false)→ 半开放政策

json
PUT controlled_city
{
  "mappings": {
    "dynamic": false   // 关闭自动建设
  }
}

政策特点:

  • 🚧 新居民可暂住:新字段数据会保存
  • 🚫 但不发房产证:不创建字段映射
  • 🚫 不通水电:新字段不可搜索
  • 📜 需审批建设:必须显式添加字段

操作演示:

json
// 插入新字段
PUT controlled_city/_doc/1
{
  "illegal_field": "无证建筑"
}

// 尝试搜索(失败)
GET controlled_city/_search
{
  "query": {"match": {"illegal_field": "无证"}}  // ❌ 找不到
}

// 但数据实际存在!
GET controlled_city/_doc/1 
/* 返回:
  "_source": {
    "illegal_field": "无证建筑"   // ✅ 藏在仓库里
  }
*/

适用场景:已知核心字段+允许未知附加字段(如HTTP头信息)


3. 严格规划区(dynamic: strict)→ 红线政策

json
PUT strict_city
{
  "mappings": {
    "dynamic": "strict"   // 严禁违规建设
  }
}

政策特点:

  • 🔴 新居民禁止进入:未知字段直接拒绝
  • 📝 必须先审批:必须预先定义字段
  • 🛑 违建强拆:插入未知字段会报错

操作演示:

json
// 尝试插入新字段
PUT strict_city/_doc/1
{
  "unknown_field": "测试"
}
// ❌ 立即报错!
// "strict_dynamic_mapping_exception": "mapping set to strict"

适用场景:金融系统、核心业务数据等严格场景


城市规划对比表

政策类型比喻新字段处理搜索支持数据存储生产建议
true(自由区)自由建房自动创建映射✅ 可搜索✅ 保存开发环境
false(管控区)无证暂住忽略字段❌ 不可搜索✅ 保存日志/扩展字段
strict(严格区)禁止进入拒绝写入-❌ 不保存核心业务系统

实战配置指南

场景1:用户档案系统(推荐 strict)

json
PUT user_profiles
{
  "mappings": {
    "dynamic": "strict",  // 严禁未知字段
    "properties": {
      "user_id": {"type": "keyword"},
      "name": {"type": "text"},
      "age": {"type": "integer"}
    }
  }
}
  • 避免恶意插入非法字段
  • 保证数据结构纯净

场景2:网站访问日志(推荐 false)

json
PUT web_logs
{
  "mappings": {
    "dynamic": false,  // 允许未知字段
    "properties": {
      "timestamp": {"type": "date"},
      "url": {"type": "keyword"},
      "response_code": {"type": "integer"}
    }
  }
}
  • 可接收浏览器头、Cookie等动态字段
  • 避免映射爆炸(mapping explosion)

场景3:快速原型开发(可用 true)

json
PUT prototype
{
  "mappings": {
    "dynamic": true   // 自由添加字段
  }
}
  • 快速验证数据结构
  • 生产前需重构为严格模式

动态模板搭配技巧

json
PUT smart_city
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"   // 自动转keyword
          }
        }
      }
    ],
    "dynamic": true   // 仍允许自动创建
  }
}
  • 自由开发区 + 建筑规范 = 既灵活又可控

记忆口诀

城市规划三政策:

  • true → 自由开发
    新字段自动注册,随意搜索
  • false → 管控开发
    新字段偷偷暂住,不能搜索
  • strict → 严格审批
    无证字段直接驱逐,绝不妥协

黄金法则:

📍 核心系统用 strict → 安全第一
📍 扩展数据用 false → 灵活存储
📍 开发调试用 true → 快速验证

记住这个城市规划局的比喻,你就能精准控制数据王国的疆土扩张!🗺️👑