Elasticsearch 提供了丰富的字段类型(Data Types)来满足不同场景的数据存储和查询需求。以下是主要字段类型的分类及详细说明,结合典型使用场景给出建议。 数据类型分类:
- 核心数据类型(Core Data Types)
- 复杂数据类型(Complex Data Types)
- 地理数据类型(Geospatial Data Types)
- 特殊用途类型(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街"}
]
}
七、类型选择最佳实践
-
文本搜索 vs 精确匹配:
- 需要分词搜索 →
text
- 需要精确匹配/聚合 →
keyword
- 两者都需要 → 使用
multi-field
- 需要分词搜索 →
-
数值类型选择原则:
- 优先选择最小够用的类型(如用
short
而不是long
)
- 优先选择最小够用的类型(如用
-
地理数据:
- 单点坐标 →
geo_point
- 复杂形状 →
geo_shape
- 单点坐标 →
-
嵌套数据:
- 需要保留对象间关系 →
nested
- 简单嵌套 →
object
- 需要保留对象间关系 →
-
动态映射风险:
- 建议关闭动态映射或严格模式
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"
}
}
}