一般来说,主要有两种映射方式:
1、动态映射:写入时,es根据字段类型识别。
2、静态映射:写入时,手动指定字段类型。
动态映射:
自动映射类型规则如下:
null -> 没有字段被添加
true or false -> boolean类型
浮点类型数字 -> float类型
数字 -> long类型
JSON对象 -> object对象
数组 -> 由数组里第一个非空值决定
string -> 有可能是date类型(开启日期检测)、double或long类型、text类型、keyword类型,es自动判定。
可以在创建索引时,通过设置dynamic参数来指定是否自动新增字段:
"dynamic":"true" 默认值为true,自动添加字段
"dynamic":"false" 忽略新的字段
"dynamic":"strict" 严格模式,发现新的字段抛出异常
比如索引一个User信息设置如下:
{
"user":{
"mappings":{
"it":{
"dynamic":false,
"properties":{
"name":{"type":"text"}
"create_time":{"type":"date"}
}
}
}
}
}
静态映射:
文档写入前,需要手动指定字段类型。
es中,字段的类型主要分为:核心类型、复合类型、地理类型和特殊类型。
这里将只关注核心类型和复合类型,这两种类型也是常用的类型。
核心类型:
核心类型主要分为如下几个类型:
1、字符串类型(string、text、keyword)。
string:
5.X 版本之后不再支持string,使用会发出警告。
text:如果一个字段需要被全文搜索的,应该设置为text类型;
设置text类型之后,字段内容会被分析,在生成倒排索引之前,字符串会被分词器分成一个一个词项;
text类型的字段不用于排序。
keyword:只能通过精确值搜索到;
keyword 类型适用于索引结构化的字段,比如主机名、状态码等;
通常用户过滤、排序、聚合。
2、数字类型(long、integer、short、byte、double、float、half_float、scaled_float)。
long -2^63 至 2^63-1
integer -2^31 至 2^31-1
short -32768 至 32767
byte -128 至 127
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类型, scaled_float是通过缩放因子把浮点数变成long类型。
3、日期类型。
JSON没有日期类型,所以Eleasticsearch可以接收如下3种形式的日期:
格式化日期的字符串,如“2015-01-01”或“2015/01/01 12:10:13”;
代表一个毫秒计时的时间戳;
代表一个秒计时的时间戳。
Elasticsearch内部存储的是毫秒计时的长整型数。
4、布尔类型。
字段类型是布尔类型的可以接受的值为true或false。
5.4版本之前,可以接受被解释为true或false的字符串和数字;
5.4版本之后,只接受true、false、"true"、"false"。
5、二进制类型。
接受base64编码的字符串,默认不存储(这里的存储是指store属性取值为false)也不可搜索。
6、范围类型。
此略。
复合类型:
1、数组类型(array)。
Elasticsearch没有专用的数组类型,默认情况下任何字段都可以包含一个或者多个值,但是一个数组中的值必须是同一种类型。
(1) 字符数组:["one", "two"]
(2) 整数数组:[1,2]
(3) 嵌套数组:[1,[2,3]] 或 [1,2,3]
(4) 对象数组:[{"name":"Mary","age":12},{"name":"John","age":12}]
2、对象类型(object)。
字段内容是JSON对象。
3、嵌套类型(nested)。
嵌套类型是 对象类型中的一个特例,可以让对象数组独立索引和查询,Lucene没有内部对象的概念,所以Elasticsearch将对象层次扁平化,转化为字段名字和值构成的简单列表。
使用 nested对象类型,可以阻止elasticsearch将对象扁平化,保持数组中每个对象的独立性。