elasticsearch字段类型选型需精准匹配业务场景:text用于全文检索,keyword用于精确匹配与聚合;数值类型须按范围与精度选择long/integer/scaled_float;date需显式声明format;boolean仅接受true/false字面量;object适用于无关联嵌套,nested用于需独立过滤的数组对象。

如果您正在设计 Elasticsearch 索引结构,但对字段类型选择和映射定义缺乏系统性认知,则可能面临搜索不准、聚合失败、存储膨胀或查询性能骤降等问题。以下是围绕 Mapping 核心机制与字段类型选型的深度解析:
一、Mapping 的本质与作用
Mapping 是 Elasticsearch 中定义索引文档结构的元数据配置,相当于关系型数据库的表 Schema,它决定了字段如何被解析、索引、存储及参与检索。其核心职责包括声明字段名称、指定数据类型、配置分词器、控制是否可搜索、是否启用 Doc Values、是否存储原始值等。
1、Mapping 不是动态运行时逻辑,而是写入文档前即生效的静态约束;
2、每个索引有且仅有一个顶层 mappings 定义(ES 7.x+ 已移除 type 概念);
3、未显式定义的字段若启用 dynamic: true,将触发动态映射自动推断,但极易导致类型冲突与字段爆炸;
4、Mapping 一旦创建,字段类型不可修改,变更需重建索引。
二、text 与 keyword 的关键区分
text 和 keyword 是最常被混淆的两种字符串类型,其底层行为截然不同:text 类型经分词器处理后构建倒排索引,适用于全文匹配;keyword 类型以完整原始值作为单个词条索引,适用于精确匹配、排序与聚合。
1、对产品标题字段,应优先定义为 {"title": {"type": "text", "analyzer": "ik_max_word"}};
2、对订单状态字段,必须定义为 {"status": {"type": "keyword"}};
3、可结合 multi-fields 实现双模能力:{"title": {"type": "text", "fields": {"keyword": {"type": "keyword", "ignore_above": 256}}}};
4、keyword 字段默认开启 doc_values,支持聚合与排序;text 字段默认关闭 doc_values,不可直接用于聚合。
三、数值类型选型策略
数值字段类型选择直接影响磁盘占用、查询精度与聚合稳定性。Elasticsearch 不支持类型自动升级,同一字段混入整数与浮点数将导致 mapping 冲突。
1、用户 ID 或计数类字段应使用 long,因其覆盖范围达 ±9.2×10¹⁸;
2、常规年龄、评分等中小整数推荐 integer,节省 32 位存储空间;
3、价格类字段禁用 float/double,应改用 scaled_float 并指定 scaling_factor(如 100),避免浮点误差;
4、float 类型仅保留 6–7 位有效数字,double 为 15–16 位,精度丢失不可逆。
四、日期与布尔类型的规范用法
date 类型必须显式声明 format,否则依赖默认格式集解析,易因格式不一致引发解析失败;boolean 类型仅接受 true/false 字面量,禁止使用字符串 "true"/"false" 或数字 1/0。
1、时间字段应严格绑定格式:{"created_at": {"type": "date", "format": "strict_date_optional_time||epoch_millis"}};
2、写入 "2026-05-12" 可匹配,但 "2026/05/12" 将报错,除非显式加入该格式;
3、布尔字段定义为 {"is_active": {"type": "boolean"}} 后,仅接受 JSON 布尔字面量;
4、若文档中传入 "is_active": "true",ES 将抛出 mapper_parsing_exception。
五、对象(object)与嵌套(nested)的适用边界
object 类型将子字段扁平化为顶级字段路径,适用于属性间无关联关系的简单嵌套;nested 类型则为每个子对象独立建模,保留数组内各元素的字段独立性,适用于需按子对象条件精确过滤的场景。
1、用户基本信息可使用 object:{"address": {"type": "object", "properties": {"city": {"type": "keyword"}, "zip": {"type": "keyword"}}}};
2、订单中的商品列表必须使用 nested:{"items": {"type": "nested", "properties": {"sku": {"type": "keyword"}, "quantity": {"type": "integer"}}}};
3、对 object 字段执行 multi_match 查询可能产生错误关联(如 city=北京 AND zip=100000 匹配到不同地址);
4、nested 查询必须配合 nested query,且需指定 path,普通 term 查询无效。










