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"
    }
  }
}
相关推荐
盖世英雄酱581366 分钟前
什么是MCP
后端·程序员
小鸡脚来咯2 小时前
SpringBoot 常用注解通俗解释
java·spring boot·后端
豌豆花下猫2 小时前
Python 3.14 t-string 要来了,它与 f-string 有何不同?
后端·python·ai
小奏技术2 小时前
Spring7将正式弃用Junit 4,我们也是时候迁移到Junit5了
后端
吴佳浩2 小时前
Python入门指南(四)-项目初始化
人工智能·后端·python
一颗知足的心2 小时前
Go语言之路————指针、结构体、方法
开发语言·后端·golang
Rabbb4 小时前
C# JSON属性排序、比较 Newtonsoft.Json
后端
蓝易云4 小时前
在Linux、CentOS7中设置shell脚本开机自启动服务
前端·后端·centos
一千柯橘4 小时前
Nestjs 解决 request entity too large
javascript·后端