ES:ES支持的数据类型
ES支持的数据类型:核心类型字符串类型 :string:text:keyword:整数类型:longintegershortbyte浮点类型double,float,half_float,scaled_float逻辑类型 :boolean日期类型 :date范围类型 :range二进制类型 binary复合类...
ES文档字段分为两类:
- 元字段(Meta-field) :不需要用户定义,在任一文档中都存在, 如_id、 _index、 _type 等
- 业务字段: 用户自定义的字段, 也就是我们添加数据时, JSON串中的key
元字段:
元字段在名称上有一个显著的特征,就是以下划线"_" 开头, 有些字段只是为了存储,他们会出现在文档检索的结果中, 却不能通过这个字段本身做检索, 如_source ; 有些字段则只是为了索引, 他会创建出一个索引,用户可以在这个索引上检索文档,但这个字段却不会出现在最终的检索结果中, 如_all 字段。 且不是所有的字段都是默认开启的, 有些元字段需要在索引中配置开启才可使用。
下面是一些元字段的介绍:
序号 | 名称 | 是否索引 | 是否存储 | 说明 | 大类 |
1 | _id | 是 | 是 | 文档ID, 在映射类型内唯一 | 标识 |
2 | _index | 否 | 否 | 文档所属索引 | |
3 | _type | 是 | 否 | 文档所属映射类型 | |
4 | _uid | \ | \ | 在索引内唯一, 由映射类型和ID共同组成, 格式为{type}#{id}, 在6.0版本已废除 | |
5 | _source | 否 | 是 | 原始JSON文档 | 源文档 |
6 | _size | 是 | 是 | _source 的字节数, 需要安装mapper-size插件 | 索引 |
7 | _all | 是 | 否 | 所有字段一起创建索引, 6.0版本废止 | |
8 | _field_names | 是 | 否 | 为文档非空字段名创建索引 | |
9 | _ignored | 是 | 是 | 为忽略字段创建索引 | |
10 | _routing | \ | \ | 文档到具体分片的路由 | 其他 |
11 | _meta | \ | \ | 应用相关元信息 |
业务字段:
业务字段我们才会考虑es支持的数据类型。
ES支持的数据类型:
1、字符串类型 :
- string:
- text:
- keyword:
从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代;当一个字段是要被全文搜索的,设置text类型,字段内容会被分析,text类型的字段不用于排序,很少用于聚合;keyword类型的字段只能通过精确值搜索到,如果字段需要进行过滤、排序、聚合,设置keyword类型。
2、整数类型:
- long
- integer
- short
- byte
在满足需求的情况下,尽可能选择范围小的数据类型,字段的长度越短,索引和搜索的效率越高。
3、浮点类型
- double:64位双精度IEEE 754浮点类型
- float:32位单精度IEEE 754浮点类型
- half_float:16位半精度IEEE 754浮点类型
- scaled_float : 缩放类型的的浮点数
对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。其中scaled_float,比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734 优先考虑使用带缩放因子的scaled_float浮点类型。
4、逻辑类型 :boolean
5、日期类型 :date
日期类型表示格式可以是以下几种:
- 日期格式的字符串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
- long类型的毫秒数( milliseconds-since-the-epoch,epoch就是指UNIX诞生的UTC时间1970年1月1日0时0分0秒)
- integer的秒数(seconds-since-the-epoch)
6、范围类型 :range
范围类型要求字段值描述的是一个数值、日期或IP地址的范围, 在添加文档时可以使用: gte、gt、lt、lte分别表示 >=、 > 、< 、<= 。
具体类型又包含:
- integer_range
- float_range
- long_range
- double_range
- data_range
- ip_range
7、二进制类型 :binary
二进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性。
8、 复合类型
- 数组类型 array
- 对象类型 object :JSON格式对象数据
- 嵌套类型 nested
- 地理类型 地理坐标类型 geo_point
- 地理地图 geo_shape
- 特殊类型 IP类型 ip
- 范围类型 completion
- 令牌计数类型 token_count
- 附件类型 attachment
- 抽取类型 percolator
在ElasticSearch中,数组是开箱即用的,不需要进行任何配置,就可以直接使用,没有专门的数组(Array)数据类型,默认情况下,任意一个字段都可以包含0或多个值。在同一个数组中,数组元素的数据类型是相同的,ElasticSearch不支持元素为多个数据类型。
9、多数据类型:
有些字段可能会以不同的方式进行检索, 如果文档字段只以一种方式编入索引, 检索性能就会受到影响。所以针对字段类型text 和 keyword , es 专门提供了一个配置字段多数据类型的参数fields, 它可以让一个字段同时具备两种数据类型的特征:
PUT articles{
"mappings"{
"properties":{
"title":{
"type":"text",
"fields":{
"raw":{"type":"keyword"},
"length":{"type":"token_count", "analyzer":"standard"}
}
}
}
}
}
上面的示例中, title字段被设置为text, 同时通过fields参数又为该字段添加了两个子字段 raw和 length, 且分别为keyword类型和token_count 类型。使用fields设置的子字段, 在添加文档时不需要不需要单独设置字段值, 他们与title共享相同的字段值, 只是会以不同的方式处理字段值, 且在查询时不会展现出来。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)