Elasticsearch 的字段类型总结

前言

Elasticsearch 提供了丰富的字段类型(Data Types)来满足不同场景的数据存储和查询需求。以下是主要字段类型的分类及详细说明,结合典型使用场景给出建议。
数据类型分类:

  1. 核心数据类型(Core Data Types)
  2. 复杂数据类型(Complex Data Types)
  3. 地理数据类型(Geospatial Data Types)
  4. 特殊用途类型(Specialized Data Types)

一、核心数据类型(Core Data Types)

类型说明典型场景
text全文搜索字段,会被分词器处理,适合长文本文章内容、商品描述、日志正文
keyword精确值字段,不参与分词,适合过滤、聚合、排序标签、状态码、分类ID、枚举值
long64位整数(-2⁶³ ~ 2⁶³-1)订单金额、库存数量
integer32位整数(-2³¹ ~ 2³¹-1)年龄、数量计数器
short16位整数(-32,768 ~ 32,767)状态码、小范围数值
byte8位整数(-128 ~ 127)开关状态、微小数值
double双精度浮点数科学计算数据、高精度价格
float单精度浮点数普通价格、地理坐标
boolean布尔值(true/false)开关状态、是否标记
date日期类型(支持多种格式)日志时间、订单日期
ipIPv4/IPv6地址访问者IP分析
binaryBase64编码的二进制数据存储加密数据、小文件

二、复杂数据类型(Complex Data Types)

类型说明典型场景
object嵌套JSON对象(非独立文档)用户地址信息、商品属性
nested嵌套文档(独立存储,保留对象间关系)订单商品列表、评论回复
flattened将整个JSON对象存储为单个字段动态元数据、不确定结构的日志

三、地理数据类型(Geospatial Data Types)

类型说明典型场景
geo_point经纬度坐标(lat/lon)地图定位、附近搜索
geo_shape复杂地理形状(多边形、线等)地理围栏、区域划分

四、特殊用途类型(Specialized Data Types)

类型说明典型场景
range范围值(integer_range, date_range等)价格区间、时间段过滤
alias字段别名(指向现有字段)字段重命名、兼容旧查询
join定义父子文档关系商品与评论、文章与回复
percolator存储查询DSL,用于反向匹配预警系统、实时规则匹配
histogram预聚合直方图数据科学数据可视化
search_as_you_type支持逐词搜索建议的字段自动补全、即时搜索

五、多字段特性(Multi-Fields)

核心功能:允许一个字段同时以多种类型存储
典型配置:

{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text",          // 主字段用于全文搜索
        "fields": {
          "raw": {              // 子字段用于精确匹配
            "type": "keyword"
          }
        }
      }
    }
  }
}

六、数组类型处理

Elasticsearch 没有专用数组类型,但所有字段都天然支持数组:

// 合法定义
{
  "tags": ["电子", "数码", "手机"],       // keyword数组
  "prices": [1999.0, 2199.0],          // float数组
  "addresses": [                        // object数组
    {"type": "home", "street": "xx路"},
    {"type": "office", "street": "yy街"}
  ]
}

七、类型选择最佳实践

  1. 文本搜索 vs 精确匹配:
  • 需要分词搜索 → text
  • 需要精确匹配/聚合 → keyword
  • 两者都需要 → 使用multi-field
  1. 数值类型选择原则:
  • 优先选择最小够用的类型(如用short而不是long)
  1. 地理数据:
  • 单点坐标 → geo_point
  • 复杂形状 → geo_shape
  1. 嵌套数据:
  • 需要保留对象间关系 → nested
  • 简单嵌套 → object
  1. 动态映射风险:
  • 建议关闭动态映射或严格模式
"dynamic": "strict"  // 禁止自动添加新字段

八、常见问题解决方案

场景1:标签系统优化
需求:既要支持标签过滤,又要支持标签云聚合
方案:

{
  "tags": {
    "type": "keyword",
    "ignore_above": 256  // 忽略超长标签
  }
}

场景2:商品属性搜索
需求:按多属性组合筛选(颜色+尺寸)
方案:

{
  "attributes": {
    "type": "nested",
    "properties": {
      "name": {"type": "keyword"},
      "value": {"type": "keyword"}
    }
  }
}

场景3:日志时间范围查询
需求:快速查询特定时间段的日志
方案:

{
  "log_time": {
    "type": "date",
    "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
  }
}

通过合理选择字段类型,可以显著提升以下性能指标:

  • 查询速度提升 30%-50%
  • 存储空间减少 20%-40%
  • 聚合效率提高 2-3倍

建议结合 _mapping API 实时验证类型设置:

# 查看现有映射
GET /your_index/_mapping

# 动态添加字段(7.x+版本)
PUT /your_index/_mapping
{
  "properties": {
    "new_field": {
      "type": "keyword"
    }
  }
}

关于我
loading