常用字段类型
总结
text会分词,用于全文搜索;keyword不分词,用于精确匹配- 数值类型按实际范围选,别无脑用
long date存毫秒数或格式化字符串都行
1. 字符串类型
这是最常用的,也是最容易搞混的,详细使用见 搜索的简单使用:
| 类型 | 是否分词 | 适用场景 |
|---|---|---|
text |
是 | 文章内容、商品描述等需要全文搜索的字段 |
keyword |
否 | 状态、标签、ID 等需要精确匹配/排序/聚合的字段 |
一个字段如果既要全文搜索又要精确匹配,可以同时设置两种类型(multi-fields):
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
2. 数值类型
按实际数据范围选,不要无脑用 long,占空间也影响性能:
| 类型 | 范围 |
|---|---|
byte |
-128 ~ 127 |
short |
-32768 ~ 32767 |
integer |
-2^31 ~ 2^31-1 |
long |
-2^63 ~ 2^63-1 |
float |
单精度浮点 |
double |
双精度浮点 |
half_float |
16位浮点,精度低但省空间 |
scaled_float |
按比例缩放的浮点,如价格用 scaling_factor: 100 |
3. 其他常用类型
布尔:boolean,存 true / false
日期:date,支持毫秒时间戳或格式化字符串,查询时统一转成 UTC 毫秒数处理
二进制:binary,存 base64 编码字符串,默认不存储、不可搜索,一般不用
4. 范围类型
适合存"区间"数据,比如年龄段、价格区间:
| 类型 | 说明 |
|---|---|
integer_range |
整数范围 |
float_range |
浮点范围 |
double_range |
双精度浮点范围 |
long_range |
长整型范围 |
date_range |
日期范围 |
存储示例(age 字段是 integer_range):
{
"age": { "gte": 20, "lte": 40 }
}
查询时用 term 查询。
5. 复杂类型
- 数组 Array:ES 里任何字段都可以存多个值,不需要特别声明类型,但数组内元素类型必须一致
- 对象 Object:嵌套 JSON 对象,ES 内部会展平成
a.b的形式存储
6. 专用类型
- IP:
ip类型,支持 CIDR 子网掩码查询,比如192.168.0.0/16 - geo_point:地理坐标,支持距离查询和范围查询