Elasticsearch学习笔记(7)

Elasticsearch 映射

映射就是Mapping,它用来定义一个文档以及文档所包含的字段该如何被存储和索引。所以,它其实有点类似于关系型数据库中表的定义。

映射分类

动态映射 / 静态映射

动态映射,顾名思义,就是自动创建出来的映射。

静态映射指定是手动创建的映射。

ES 根据存入的文档,自动分析出来文档中字段的类型以及存储方式,这种就是动态映射。

例如,新建一个索引,查看索引信息:

1
2
PUT blog
GET blog

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"blog" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "blog",
"creation_date" : "1623142050956",
"number_of_replicas" : "1",
"uuid" : "JubS67p8Q7egZll5MQ9GAw",
"version" : {
"created" : "7120199"
}
}
}
}
}

在创建好的索引信息中,我们可以看到,mappings 为空,这个 mappings 中保存的就是映射信息。

现在我们向索引中添加一个文档,如下:

1
2
3
4
5
PUT blog/_doc/1
{
"title":"blog1",
"date":"2021-06-08"
}

文档添加成功后,就会自动生成mappings。

1
GET blog/_mapping

可以看到, date 字段的类型为 date, title 的类型有两个, text 和 keyword。(ES 5 之前字符串类型只有一个 string类型)

默认情况下,文档中如果新增了字段,mappings中也会自动新增进来。

有的时候,如果希望新增字段时,能够抛出异常来提醒开发者,这个可以通过 mappings 中的 dynamic 属性来配置。

dynamic 有三种取值:

  • true : 默认,自动添加新字段。
  • false: 忽略新字段。
  • strict: 严格模式,发现新字段,会抛出异常。

具体配置方式如下,创建索引时指定mappings(其实就是静态映射):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUT blog
{
"mappings": {
"dynamic": "strict",
"properties": {
"title":{
"type": "text"
},
"age":{
"type": "long"
}
}
}
}

我们此时添加文档,如下图:

可以看到我们没有配置 date 字段的映射,添加文档时出现错误。

动态映射还有一个日期检测的问题。

例如新建一个索引,然后添加一个含有日期的文档,如下:

1
2
3
4
5
6
PUT blog

PUT blog/_doc/1
{
"remark":"2021-06-08"
}

添加成功后,remark字段会被推断为日期类型。

此时remark字段就无法存储其他类型数据。

要解决这个问题,可以使用静态映射,即在索引定义时,将remark指定为text类型。也可以关闭日期检测。

关闭日期检测:

1
2
3
4
5
6
PUT blog
{
"mappings": {
"date_detection": false
}
}

此时日期类型就会被当成文本来处理。

类型推断

ES 中动态映射类型推断方式如下:

JSON中的数据自动推断出来的数据类型
null没有字段被添加
true/falseboolean
浮点数字float
数字long
JSON 对象object
数组数组中的第一个非空值决定
Stringtext/keyword/date/double/long 都有可能



-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

您的支持就是我创作的动力!

欢迎关注我的其它发布渠道