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"
    }
  }
}
相关推荐
Nicander4 分钟前
多数据源下@transcation事务踩坑
java·后端
郑州光合科技余经理9 分钟前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
sjsjsbbsbsn1 小时前
大模型核心知识总结
java·人工智能·后端
Moment1 小时前
2026 年,AI 全栈时代到了,前端简历别再只写前端技术了 🫠🫠🫠
前端·后端·面试
白晨并不是很能熬夜2 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio
zshs0003 小时前
#从偶发无字幕到补偿探测链路:一次 B 站字幕导入问题的完整收敛过程
java·后端·重构
IT_陈寒3 小时前
JavaScript里这个隐式类型转换的坑,我终于爬出来了
前端·人工智能·后端
掘金者阿豪3 小时前
Django接金仓数据库:我踩过的坑和填坑指南
后端
_风满楼4 小时前
HTTP 请求的五种传参方式
前端·javascript·后端
码事漫谈4 小时前
为什么 token 计费规则里,输出比输入贵那么多
后端