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"
    }
  }
}
相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿9 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909610 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒12 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构13 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构13 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构13 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常14 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端