Elasticsearch索引字段的类型
在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结:
1. keyword
类型(精确匹配)
-
适合数据:
- 不需要分词,直接用于过滤、排序、聚合等操作的数据。
-
常见字段:
- 用户 ID、手机号、身份证、订单号、状态码、城市名称、标签、分类名、性别、IP、UUID 等。
-
说明:
keyword
是不可被分词的,整体作为一个字符串处理,支持term
查询、terms
查询、terms aggregation
聚合等。
例子:
"user_id": { "type": "keyword" }
"status": { "type": "keyword" }
2. text
类型(分词全文检索)
-
适合数据:
- 需要做全文搜索(模糊搜索、关键词搜索)的字段。
-
常见字段:
- 评论内容、商品标题、文章内容、日志描述等。
-
说明:
- 默认会使用 analyzer 分词器进行分词处理,适合搜索但不适合做聚合或排序。
🔸 例子:
"title": { "type": "text" }
"comment": { "type": "text" }
组合用法:
text + keyword
(一个字段两个视图)
"username": {"type": "text","fields": {"keyword": { "type": "keyword" }}
}
这样 username
可以分词搜索,也可以用 username.keyword
精确匹配、排序、聚合。
3. integer
/ long
/ float
/ double
-
适合数据:
- 数值类型字段,如金额、数量、分数、时间戳等。
-
常见字段:
- 年龄、价格、库存、评分、时间戳(可用
long
表示)、纬度经度等。
- 年龄、价格、库存、评分、时间戳(可用
-
建议选择:
integer
:32位整数,适合一般数值;long
:64位整数,如毫秒时间戳;float
/double
:浮点类型,有精度要求时用double
。
🔸 例子:
"price": { "type": "double" }
"timestamp": { "type": "long" }
4. date
-
适合数据:
- 任何格式化的日期时间,比如创建时间、更新时间、登录时间等。
-
常见字段:
createTime
,updateTime
,logTime
-
说明:
- 支持范围查询和时间聚合;
- 可以通过
format
指定日期格式。
🔸 例子:
"create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||epoch_millis" }
5. boolean
-
适合数据:
- true/false 类型,如是否删除、是否启用等。
🔸 例子:
"is_deleted": { "type": "boolean" }
6. nested
-
适合数据:
- 对象数组结构,需要对数组中每个对象进行独立查询时使用。
🔸 例子(用户有多个订单):
"orders": {"type": "nested","properties": {"order_id": { "type": "keyword" },"amount": { "type": "double" }}
}
7. object
-
适合数据:
- 简单对象结构(非数组),如 address。
🔸 例子:
"address": {"type": "object","properties": {"province": { "type": "keyword" },"city": { "type": "keyword" }}
}
不推荐的数据类型(谨慎使用)
类型 | 说明 |
---|---|
text 做聚合或排序 | 会报错,需要用 keyword |
大文本字段 | 用 text ,并避免在 UI 上分页返回 |
非结构化 JSON | 不推荐嵌套太深的结构体,会影响性能 |
总结推荐表
数据类型 | 推荐映射类型 | 用途 |
---|---|---|
用户名 | text + keyword | 模糊搜索 + 精准聚合 |
状态码 | keyword | 精确过滤 |
评论内容 | text | 分词搜索 |
创建时间 | date | 时间范围查询 |
价格/分数 | double | 数值计算 |
是否删除标识 | boolean | 布尔条件 |
时间戳 | long | 毫秒时间 |
地址结构体 | object | 结构化字段 |
对象数组(如订单) | nested | 嵌套多值数组 |