1 核心数据类型
1.1 字符串类型 - string(不再支持)
(1) 使用示例: PUT website
{ "mappings": { "blog": { "properties": { "title": {"type": "string"}, // 全文本 "tags": {"type": "string", "index": "not_analyzed"} // 关键字, 不分词 } } }}
(2) ES 5.6.10中的响应信息:
#! Deprecation: The [string] field is deprecated, please use [text] or [keyword] instead on [tags]#! Deprecation: The [string] field is deprecated, please use [text] or [keyword] instead on [title]{ "acknowledged": true, "shards_acknowledged": true, "index": "website"}
(3) ES 6.6.0中的响应信息:
{ "error": { "root_cause": [ { "type": "mapper_parsing_exception", "reason": "No handler for type [string] declared on field [title]" } ], "type": "mapper_parsing_exception", "reason": "Failed to parse mapping [blog]: No handler for type [string] declared on field [title]", "caused_by": { "type": "mapper_parsing_exception", "reason": "No handler for type [string] declared on field [title]" } }, "status": 400}
可知string类型的field已经被移除了, 我们需要用text或keyword类型来代替string.
1.1.1 文本类型 - text
在Elasticsearch 5.4 版本开始, text取代了需要分词的string. —— 当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型. text的内容会被分词, 可以设置是否需要存储: "index": "true|false". text类型的字段不能用于排序, 也很少用于聚合. 使用示例:
PUT website
{ "mappings": { "blog": { "properties": { "summary": {"type": "text", "index": "true"} } } }}
1.1.2 关键字类型 - keyword
在Elasticsearch 5.4 版本开始, keyword取代了不需要分词的string. —— 当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型. keyword的内容不会被分词, 可以设置是否需要存储: "index": "true|false". 使用示例:
PUT website
{ "mappings": { "blog": { "properties": { "tags": {"type": "keyword", "index": "true"} } } }}
1.2 数字类型 - 8种
数字类型有如下分类:
类型说明byte有符号的8位整数, 范围: [-128 ~ 127]short有符号的16位整数, 范围: [-32768 ~ 32767]integer有符号的32位整数, 范围: [$-2^{31}$ ~ $2^{31}$-1]long有符号的32位整数, 范围: [$-2^{63}$ ~ $2^{63}$-1]float32位单精度浮点数double64位双精度浮点数half_float16位半精度IEEE 754浮点类型scaled_float缩放类型的的浮点数, 比如price字段只需精确到分, 57.34缩放因子为100, 存储结果为5734
使用注意事项: 尽可能选择范围小的数据类型, 字段的长度越短, 索引和搜索的效率越高; 优先考虑使用带缩放因子的浮点类型.
使用示例:
PUT shop
{ "mappings": { "book": { "properties": { "name": {"type": "text"}, "quantity": {"type": "integer"}, // integer类型 "price": { "type": "scaled_float", // scaled_float类型 "scaling_factor": 100 } } } }}
1.3 日期类型 - date
JSON没有日期数据类型, 所以在ES中, 日期可以是: 包含格式化日期的字符串, "2019-10-01", 或"2019/10/01 12:10:30". 代表时间毫秒数的长整型数字. 代表时间秒数的整数. 如果时区未指定, 日期将被转换为UTC格式, 但存储的却是长整型的毫秒值. 可以自定义日期格式, 若未指定, 则使用默认格式: strict_date_optional_time||epoch_millis
(1) 使用日期格式示例:
// 添加映射
PUT website
{ "mappings": { "blog": { "properties": { "pub_date": {"type": "date"} // 日期类型 } } }}
// 添加数据
PUT website/blog/11
{ "pub_date": "2019-10-10" }
PUT website/blog/12
{ "pub_date": "2019-10-10T12:00:00Z" }
PUT website/blog/13
{ "pub_date": "1589584930103" } // 时间的毫秒值
(2) 多种日期格式: 多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的. 第一个格式用于将时间毫秒值转换为对应格式的字符串. 使用示例:
// 添加映射,可以接受如下类型的格式 PUT website
{ "mappings": { "blog": { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } }}
1.4 布尔类型 - boolean
可以接受表示真、假的字符串或数字:
- 真值: true, "true", "on", "yes", "1"...
- 假值: false, "false", "off", "no", "0", ""(空字符串), 0.0, 0
1.5 二进制型 - binary
二进制类型是Base64编码字符串的二进制值, 不以默认的方式存储, 且不能被搜索. 有2个设置项:
- (1) doc_values: 该字段是否需要存储到磁盘上, 方便以后用来排序、聚合或脚本查询. 接受true和false(默认);
- (2) store: 该字段的值是否要和_source分开存储、检索, 意思是除了_source中, 是否要单独再存储一份. 接受true或false(默认). 使用示例: // 添加映射
PUT website{ "mappings": { "blog": { "properties": { "blob": {"type": "binary"} // 二进制 } } }}
// 添加数据
PUT website/blog/1{ "title": "Some binary blog", "blob": "hED903KSrA084fRiD5JLgY=="}
注意: Base64编码的二进制值不能嵌入换行符, 逗号(0x2c)等符号.
1.6 范围类型 - range
range类型支持以下几种:
类型范围integer_range$-2^{31}$ ~ $2^{31}-1$long_range$-2^{63}$ ~ $2^{63}-1$float_range32位单精度浮点型double_range64位双精度浮点型date_range64位整数, 毫秒计时ip_rangeIP值的范围, 支持IPV4和IPV6, 或者这两种同时存在
(1) 添加映射:
PUT company{ "mappings": { "department": { "properties": { "expected_number": { // 预期员工数 "type": "integer_range" }, "time_frame": { // 发展时间线 "type": "date_range", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "ip_whitelist": { // ip白名单 "type": "ip_range" } } } }}
(2) 添加数据:
PUT company/department/1{ "expected_number" : { "gte" : 10, "lte" : 20 }, "time_frame" : { "gte" : "2019-10-01 12:00:00", "lte" : "2019-11-01" }, "ip_whitelist": "192.168.0.0/16"}
(3) 查询数据:
GET company/department/_search{ "query": { "term": { "expected_number": { "value": 12 } } }}
GET company/department/_search{ "query": { "range": { "time_frame": { "gte": "2019-08-01", "lte": "2019-12-01", "relation": "within" } } }}
查询结果:
{ "took": 26, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 1.0, "hits": [ { "_index": "company", "_type": "department", "_id": "1", "_score": 1.0, "_source": { "expected_number": { "gte": 10, "lte": 20 }, "time_frame": { "gte": "2019-10-01 12:00:00", "lte": "2019-11-01" }, "ip_whitelist" : "192.168.0.0/16" } } ] }}