Nemo

Nemo 关注TA

路漫漫其修远兮,吾将上下而求索。

Nemo

Nemo

关注TA

路漫漫其修远兮,吾将上下而求索。

  •  普罗旺斯
  • 负责帅就完事了
  • 写了1,493,291字

该文章投稿至Nemo社区   Java  板块 复制链接


Elasticsearch 字段映射

发布于 2020/05/14 10:42 1,253浏览 0回复 2,244

一般来说,主要有两种映射方式:

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将对象扁平化,保持数组中每个对象的独立性。




点赞(0)
点了个评