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" } } ] }}