4. 索引命名与数据契约设计

跨团队共享数据时,真正容易出问题的往往不是查询语法,而是“名字对不上、字段含义不一致、版本悄悄变了”。索引命名与数据契约,就是把口头约定固化成可校验、可演进的规则。本节围绕四个可落地的约定展开:索引命名、字段映射、版本管理、生命周期。

一、索引命名:让名字自带语义

共享索引的命名应能回答三个问题:谁的数据、什么内容、哪个版本。推荐采用“域-实体-环境-版本”的分段结构,用连字符分隔,全部小写,避免大写与下划线混用。例如:

order-center-orders-prod-v2
order-center-orders-staging-v2
user-profile-events-prod-v1

其中 order-center 是数据域(团队/系统),orders 是实体,prod 是环境,v2 是契约版本。别名(alias)是共享的关键:消费方只读别名 order-center-orders,写入方通过别名切换指向具体版本索引。这样版本升级时消费方无需改代码。命名中禁止出现日期作为唯一区分(如 orders-20240601),日期应交给索引生命周期管理(ILM)的滚动策略处理,而不是写进契约名。

二、字段映射:契约的核心是类型与语义

字段映射不只是 text 还是 keyword,更要约定字段的业务含义、是否可空、单位与枚举值。共享契约应明确:字段名、类型、是否必填、示例值、枚举范围。例如订单共享契约中,order_id 为 keyword 且必填,amount 为 scaled_float 且单位为“分”,status 为 keyword 且枚举为 created/paid/shipped/closed。类型一旦确定,禁止在同一版本内变更,因为 Elasticsearch 不允许对已有字段改类型,只能通过新版本索引重建。

共享前用 GET /order-center-orders/_mapping 导出映射,作为契约附件随版本归档,消费方可据此生成查询与解析代码。

三、版本管理:用别名做无感切换

版本号放在索引名末尾,别名指向当前版本。升级流程为:创建 v2 索引并写入新映射 → 双写或回填数据 → 校验文档数与抽样字段 → 将别名从 v1 原子切换到 v2。切换命令示例:

POST /_aliases
{
  "actions": [
    { "remove": { "index": "order-center-orders-prod-v1", "alias": "order-center-orders" } },
    { "add":    { "index": "order-center-orders-prod-v2", "alias": "order-center-orders" } }
  ]
}

版本号递增规则:新增可选字段为次版本(v1→v1.1 可仍用同一索引,因 ES 支持动态新增字段);删除字段、改类型、改语义为主版本(v1→v2,必须新索引)。契约文档中要写明每个版本的变更点与兼容性说明。

四、生命周期:数据从热到冷的约定

共享数据必须约定保留多久、何时降冷、何时删除。用 ILM 策略绑定索引模板,例如热阶段 7 天、温阶段 30 天、冷阶段 90 天、之后删除。消费方需知道:超过 90 天的数据不可查,因此对账类查询要限定时间范围。生命周期策略也应写入契约,避免消费方误以为数据永久可用。

索引命名与数据契约:四层约定关系 ① 索引命名 域-实体-环境-版本:order-center-orders-prod-v2 别名 order-center-orders 指向当前版本,消费方只读别名 别名 → v2 索引 切换时消费方无感 ② 字段映射契约 字段名 · 类型 · 必填 · 单位 · 枚举值 order_id:keyword 必填 | amount:scaled_float 单位分 | status:keyword 枚举 类型确定后 同版本内禁止变更 ③ 版本管理 新增可选字段 → 次版本;删字段/改类型/改语义 → 主版本新索引 升级:建 v2 → 回填 → 校验 → 别名原子切换 v1 → v2 契约文档记录变更点 ④ 生命周期 热 7 天 → 温 30 天 → 冷 90 天 → 删除;消费方须限定查询时间范围 消费方 按契约查询

五、契约文档示例

把上述约定写成一份可交付的契约文档,字段与规则如下表所示,团队可直接复制填写。

项目约定内容示例
索引名域-实体-环境-版本order-center-orders-prod-v2
别名去掉版本号,消费方只读别名order-center-orders
字段 order_idkeyword,必填ORD-20240601-001
字段 amountscaled_float,单位分,必填19900
字段 statuskeyword,枚举 created/paid/shipped/closedpaid
版本规则新增可选字段次版本;改类型/删字段主版本v1→v2 新索引
生命周期热7天/温30天/冷90天/删除ILM 策略绑定模板
常见错误:消费方直接写死具体版本索引名(如 ...-v1),导致升级后查询失败;或写入方在未通知的情况下修改字段语义(如把“分”改成“元”),造成金额放大 100 倍。契约文档与别名机制正是为了避免这两类问题。

落地时建议把契约文档纳入代码仓库,与索引模板、ILM 策略一起版本化。每次变更走评审,消费方确认兼容性后再切换别名。这样跨团队共享就从“靠记忆和口头约定”变成“靠契约和自动化校验”,协作成本显著降低。