一、数据类型
1.1 核心数据类型
字符串型:text、keyword(不会分词)
数值型:long、integer、short、byte、double、float、half_float等
日期类型:date
布尔类型:boolean
二进制类型:binary
范围类型:integer_range、float_range、long_range、double_range、date_range
1.2 复杂数据类型
数组类型:array
对象类型:object
嵌套类型:nested object
地理位置数据类型:geo_point、geo_shape
专用类型:ip(记录ip地址)、completion(实现自动补全)、token_count(记录分词数)、murmur3(记录字符串hash值)
1.3 多字段特性
多字段特性(multi-fields),表示允许对同一字段采用不同的配置,比如分词。
常见例子是对人名实现拼音搜索,只需要在人名中新增一个字段pinyin即可。但是这种方式不是十分优雅,multi-fields可以在不改变整体结构的前提下,增加一个子字段:

二、Dynamic mapping
2.1 自动识别规则
在前面说过,在写入文档的时候如果index不存在的话es会自动创建这个索引。但是es是如何确定index字段的类型的呢?
首先es可以自动识别文档字段的类型,这样可以降低用户的使用成本。

es是依靠json文档的字段类型来实现自动识别字段类型的:


2.2 日期自动识别
日期的自动识别可以自行配置日期的格式,默认情况下是:
["strict_date_opeional_time", "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
strict_date_opeional_time 是ISO 标准的日期格式,完整的格式如下:
YYYY-MM-DDhh:mm:ssTZD(eg:1997-07-16y19:20:30+01:00)
dynamic_date_formats:可以自定义日期类型
date_detection:可以关闭日期自动识别机制(默认开启)
首先创建一个日期自动识别的索引:
PUT test_index { "mappings": { "doc": { "dynamic_date_formats": ["MM/dd/yyyy"] } } }
然后创建一个文档:
PUT test_index/doc/1 { "create_time": "09/21/2016" }
查看mapping:
GET test_index/_mapping

关闭日期自动识别可以如下:

2.3 数字自动识别
字符串为数字的时候,默认不会自动识别为整型,因为字符串中出现数字是完全合理的。
numeric_detection 可以开启字符串中数字的自动识别。
