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、枚举值
long 64位整数(-2⁶³ ~ 2⁶³-1) 订单金额、库存数量
integer 32位整数(-2³¹ ~ 2³¹-1) 年龄、数量计数器
short 16位整数(-32,768 ~ 32,767) 状态码、小范围数值
byte 8位整数(-128 ~ 127) 开关状态、微小数值
double 双精度浮点数 科学计算数据、高精度价格
float 单精度浮点数 普通价格、地理坐标
boolean 布尔值(true/false) 开关状态、是否标记
date 日期类型(支持多种格式) 日志时间、订单日期
ip IPv4/IPv6地址 访问者IP分析
binary Base64编码的二进制数据 存储加密数据、小文件

二、复杂数据类型(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)

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

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

六、数组类型处理

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

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

七、类型选择最佳实践

  1. 文本搜索 vs 精确匹配

    • 需要分词搜索 → text
    • 需要精确匹配/聚合 → keyword
    • 两者都需要 → 使用multi-field
  2. 数值类型选择原则

    • 优先选择最小够用的类型(如用short而不是long
  3. 地理数据

    • 单点坐标 → geo_point
    • 复杂形状 → geo_shape
  4. 嵌套数据

    • 需要保留对象间关系 → nested
    • 简单嵌套 → object
  5. 动态映射风险

    • 建议关闭动态映射或严格模式
    json 复制代码
    "dynamic": "strict"  // 禁止自动添加新字段

八、常见问题解决方案

场景1:标签系统优化

需求 :既要支持标签过滤,又要支持标签云聚合
方案

json 复制代码
{
  "tags": {
    "type": "keyword",
    "ignore_above": 256  // 忽略超长标签
  }
}

场景2:商品属性搜索

需求 :按多属性组合筛选(颜色+尺寸)
方案

json 复制代码
{
  "attributes": {
    "type": "nested",
    "properties": {
      "name": {"type": "keyword"},
      "value": {"type": "keyword"}
    }
  }
}

场景3:日志时间范围查询

需求 :快速查询特定时间段的日志
方案

json 复制代码
{
  "log_time": {
    "type": "date",
    "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
  }
}

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

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

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

python 复制代码
# 查看现有映射
GET /your_index/_mapping

# 动态添加字段(7.x+版本)
PUT /your_index/_mapping
{
  "properties": {
    "new_field": {
      "type": "keyword"
    }
  }
}
相关推荐
Asthenia041225 分钟前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia041227 分钟前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia041227 分钟前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox37 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
uhakadotcom1 小时前
构建高效自动翻译工作流:技术与实践
后端·面试·github
Asthenia04121 小时前
深入分析Java中的AQS:从应用到原理的思维链条
后端
Asthenia04121 小时前
如何设计实现一个定时任务执行器 - SpringBoot环境下的最佳实践
后端
兔子的洋葱圈2 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
Asthenia04122 小时前
如何为这条sql语句建立索引:select * from table where x = 1 and y < 1 order by z;
后端