🌺The Begin🌺点点关注,收藏不迷路🌺

一、前言

在 Elasticsearch 中,数据类型(Mapping)设计是索引建模的灵魂,直接决定查询性能、存储空间、聚合能力、排序功能。

新手最容易犯的错误:全部用字符串/text存储、数值存为字符串、日期不规范、复杂类型滥用,最终导致查询失败、聚合报错、集群性能雪崩。

本文从ES 支持的所有数据类型、核心分类、选型流程图、实战规则、最佳实践全方位讲解,让你零基础也能设计出高性能 Mapping。


二、Elasticsearch 数据类型:官方分类与完整清单

ES 数据类型非常丰富,按功能分为 6 大类,覆盖所有业务场景:

2.1 字符串类型(最常用)

  1. text:长文本分词,全文检索
  2. keyword:短字符串不分词,精确匹配/聚合

2.2 数值类型

  1. integer:整数(-2³¹ ~ 2³¹-1)
  2. long:长整数
  3. float:单精度浮点
  4. double:双精度浮点
  5. short:短整型
  6. byte:字节型
  7. scaled_float:高精度小数(推荐金额用)

2.3 日期类型

  1. date:日期/时间(支持时间戳、yyyy-MM-dd 格式)

2.4 布尔类型

  1. boolean:true / false

2.5 复杂类型

  1. object:对象(嵌套 JSON)
  2. nested:数组对象(解决对象数组无法独立查询问题)
  3. flattened:扁平类型(JSON 整体不解析)

2.6 特殊类型

  1. ip:IP 地址(支持 IP 段查询)
  2. geo_point:地理位置(经纬度)
  3. binary:二进制
  4. range:范围类型
  5. 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 字符串类型

  1. text

    • 作用:分词、全文检索
    • 场景:文章内容、商品描述、评论、标题
    • 特性:不支持聚合、排序
  2. keyword

    • 作用:精确匹配、聚合、排序、去重
    • 场景:状态、枚举、手机号、ID、城市、姓名
    • 特性:不分词、支持所有查询/聚合

4.2 数值类型

  1. integer:年龄、数量、状态码
  2. long:订单 ID、用户 ID、超大数字
  3. double:价格、长度、重量
  4. scaled_float:金融金额(推荐)

4.3 日期类型 date

  • 存储格式:时间戳、yyyy-MM-dd HH:mm:ss
  • 场景:创建时间、更新时间、日志时间
  • 优势:支持时间范围查询、按时间聚合

4.4 布尔类型 boolean

  • 场景:是否删除、是否生效、开关状态
  • 优势:极小存储空间、极快过滤速度

4.5 复杂类型

  1. object:普通 JSON 对象
  2. nested:对象数组(必须用 nested 才能独立查询)

4.6 特殊类型

  1. ip:存储 IP,支持 IP 段筛选
  2. 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、编号keywordtext、string
姓名、城市keywordtext
内容、描述textkeyword
年龄、数量integerkeyword
价格、金额double/scaled_floatkeyword
创建时间datekeyword、text
开关状态booleankeyword、text
IP 地址ipkeyword
经纬度geo_pointkeyword
对象数组nestedobject

九、总结:选型核心口诀

  1. 短字符串选 keyword,长文本选 text
  2. 数字用数值,时间用 date,布尔用 boolean
  3. IP 用 ip,地理位置用 geo_point
  4. 对象数组用 nested,禁止用 object
  5. 类型越小越好,性能越高越好

十、文末总结

Elasticsearch 数据类型是 Mapping 设计的基础,选型错误会导致功能不可用、性能暴跌

只要严格按照选型流程图+分类规则,就能轻松设计出稳定、高效、可扩展的生产级 Mapping。

本文覆盖 ES 全部数据类型 + 选型逻辑 + 实战示例 + 避坑指南,是 ES 建模必备参考手册。


总结

  1. ES 6 大类数据类型:字符串、数值、日期、布尔、复杂、特殊
  2. 选型核心:短字符串 keyword,长文本 text,数字数值,时间 date
  3. 选型流程图:按字段类型→业务用途→性能最优逐级选择
  4. 生产禁忌:禁止字符串存数字/时间,禁止对象数组用 object
  5. 最佳实践:小类型优先、双类型 text+keyword、nested 处理数组对象

在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐