Elasticsearch 数据类型全解析:支持类型+选型指南+实战流程图
·
Elasticsearch 数据类型全解析:支持类型+选型指南+实战流程图
|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
一、前言
在 Elasticsearch 中,数据类型(Mapping)设计是索引建模的灵魂,直接决定查询性能、存储空间、聚合能力、排序功能。
新手最容易犯的错误:全部用字符串/text存储、数值存为字符串、日期不规范、复杂类型滥用,最终导致查询失败、聚合报错、集群性能雪崩。
本文从ES 支持的所有数据类型、核心分类、选型流程图、实战规则、最佳实践全方位讲解,让你零基础也能设计出高性能 Mapping。
二、Elasticsearch 数据类型:官方分类与完整清单
ES 数据类型非常丰富,按功能分为 6 大类,覆盖所有业务场景:
2.1 字符串类型(最常用)
- text:长文本分词,全文检索
- keyword:短字符串不分词,精确匹配/聚合
2.2 数值类型
- integer:整数(-2³¹ ~ 2³¹-1)
- long:长整数
- float:单精度浮点
- double:双精度浮点
- short:短整型
- byte:字节型
- scaled_float:高精度小数(推荐金额用)
2.3 日期类型
- date:日期/时间(支持时间戳、yyyy-MM-dd 格式)
2.4 布尔类型
- boolean:true / false
2.5 复杂类型
- object:对象(嵌套 JSON)
- nested:数组对象(解决对象数组无法独立查询问题)
- flattened:扁平类型(JSON 整体不解析)
2.6 特殊类型
- ip:IP 地址(支持 IP 段查询)
- geo_point:地理位置(经纬度)
- binary:二进制
- range:范围类型
- alias:字段别名
三、Elasticsearch 数据类型:选型决策流程图(核心)
3.1 通用选型流程图(业务字段直接对照)
渲染错误: Mermaid 渲染失败: Parse error on line 4: ...长文本/短字符串?}C -->|长文本(内容/评论)| D[text]C - ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
3.2 选型逻辑一句话总结
文本分词用 text,精确聚合用 keyword;数字用数值,时间用 date,IP 用 ip,位置用 geo,对象数组用 nested。
四、Elasticsearch 核心数据类型详解+使用场景
4.1 字符串类型
-
text
- 作用:分词、全文检索
- 场景:文章内容、商品描述、评论、标题
- 特性:不支持聚合、排序
-
keyword
- 作用:精确匹配、聚合、排序、去重
- 场景:状态、枚举、手机号、ID、城市、姓名
- 特性:不分词、支持所有查询/聚合
4.2 数值类型
- integer:年龄、数量、状态码
- long:订单 ID、用户 ID、超大数字
- double:价格、长度、重量
- scaled_float:金融金额(推荐)
4.3 日期类型 date
- 存储格式:时间戳、
yyyy-MM-dd HH:mm:ss - 场景:创建时间、更新时间、日志时间
- 优势:支持时间范围查询、按时间聚合
4.4 布尔类型 boolean
- 场景:是否删除、是否生效、开关状态
- 优势:极小存储空间、极快过滤速度
4.5 复杂类型
- object:普通 JSON 对象
- nested:对象数组(必须用 nested 才能独立查询)
4.6 特殊类型
- ip:存储 IP,支持 IP 段筛选
- geo_point:经纬度,附近的人、地图检索
五、Elasticsearch 数据类型:选择规则与核心原则
5.1 原则一:能用小类型不用大类型
- 年龄 0~120 → byte < short < integer
- 数字越小,占用空间越小,查询越快
5.2 原则二:字符串必须区分 text/keyword
- 长文本 → text
- 短字符串 → keyword
- 既要搜索又要聚合 →
text + fields.keyword
5.3 原则三:时间必须用 date 类型
- 禁止用字符串存储时间!
- 字符串无法做时间范围查询、无法按时间排序
5.4 原则四:布尔状态禁止用字符串
- 错误:
"is_delete":"1" - 正确:
"is_delete":true
5.5 原则五:对象数组必须用 nested
- 普通 object 无法精确查询数组内对象
- 数组对象 → nested
六、实战:标准 Mapping 示例(生产直接复制)
PUT /product_index
{
"mappings": {
"properties": {
"product_id": { "type": "keyword" }, // ID keyword
"product_name": { // 名称 双类型
"type": "text",
"fields": { "keyword": { "type": "keyword" } }
},
"description": { "type": "text" }, // 长文本 text
"price": { "type": "double" }, // 数值
"stock": { "type": "integer" }, // 整数
"create_time": { "type": "date" }, // 日期
"is_online": { "type": "boolean" }, // 布尔
"user_ip": { "type": "ip" }, // IP
"location": { "type": "geo_point" }, // 地理位置
"attrs": { "type": "nested" } // 对象数组
}
}
}
七、常见错误选型与后果(避坑指南)
7.1 错误1:数字用字符串存储
- 后果:无法范围查询、无法排序、占用空间大
- 正确:数值类型
7.2 错误2:时间用字符串存储
- 后果:无法时间聚合、无法范围查询
- 正确:date
7.3 错误3:所有字符串都用 text
- 后果:无法聚合、无法排序、查询不准确
- 正确:短字段用 keyword
7.4 错误4:对象数组用 object
- 后果:查询数据错乱、无法精准匹配
- 正确:nested
7.5 错误5:IP 用 keyword
- 后果:无法按 IP 段筛选
- 正确:ip 类型
八、生产环境选型速查表(建议收藏)
| 业务字段 | 推荐类型 | 禁止类型 |
|---|---|---|
| ID、编号 | keyword | text、string |
| 姓名、城市 | keyword | text |
| 内容、描述 | text | keyword |
| 年龄、数量 | integer | keyword |
| 价格、金额 | double/scaled_float | keyword |
| 创建时间 | date | keyword、text |
| 开关状态 | boolean | keyword、text |
| IP 地址 | ip | keyword |
| 经纬度 | geo_point | keyword |
| 对象数组 | nested | object |
九、总结:选型核心口诀
- 短字符串选 keyword,长文本选 text
- 数字用数值,时间用 date,布尔用 boolean
- IP 用 ip,地理位置用 geo_point
- 对象数组用 nested,禁止用 object
- 类型越小越好,性能越高越好
十、文末总结
Elasticsearch 数据类型是 Mapping 设计的基础,选型错误会导致功能不可用、性能暴跌。
只要严格按照选型流程图+分类规则,就能轻松设计出稳定、高效、可扩展的生产级 Mapping。
本文覆盖 ES 全部数据类型 + 选型逻辑 + 实战示例 + 避坑指南,是 ES 建模必备参考手册。
总结
- ES 6 大类数据类型:字符串、数值、日期、布尔、复杂、特殊
- 选型核心:短字符串 keyword,长文本 text,数字数值,时间 date
- 选型流程图:按字段类型→业务用途→性能最优逐级选择
- 生产禁忌:禁止字符串存数字/时间,禁止对象数组用 object
- 最佳实践:小类型优先、双类型 text+keyword、nested 处理数组对象

|
🌺The End🌺点点关注,收藏不迷路🌺
|
更多推荐

所有评论(0)