ElasticSearch之映射常用操作

本文案例操作,建议先阅读我之前的文章《ElasticSearch之安装及基本操作API》

Mapping (映射)类似关系型数据库中的表的结构定义。我们将数据以 JSON 格式存入到 ElasticSearch 中后,在搜索引擎中 JSON 字段映射对应的类型,这时需要 mapping 来定义内容的类型。

字段类型

JSON 数据类型映射到 ElasticSearch 定义的类型,常用的简单类型有:

JSON类型 ElasticSearch 类型
文本类型 Text/Keyword
整数类型 long/integer
浮点类型 float/double
时间类型 date
布尔值 boolean
数组 Text/Keyword

上面要注意的是时间类型,JSON 中并没有时间类型,这里主要指时间格式数据的类型。

定义映射

在关系型数据库中,存储数据之前,我们会先创建表结构,给字段指定一个存在的类型。同样 ElasticSearch 在进行数据存储前,也可以先定义好存储数据的 Mapping 结构。
先定义一个简单的 person Mapping:

上图中就是一个 Mapping 的定义,如果是在 ElasticSearch7 之前,mappings 里还有 _type 属性。

动态映射

当没有事先定义好 Mapping,添加数据时,ElasticSearch 会自动根据字段进行换算出对应的类型,但是换算出来的类型并不一定是我们想要的字段类型,还是需要人为的干预进行修改成想要的 Mapping。

更新映射

使用 dynamic 控制映射是否可以被更新。

dynamic-true

设置 dynamic 为true是默认 dynamic 的默认值,新增字段数据可以写入,同时也可以被索引,Mapping 结构也会被更新。

添加数据,同时多添加一个没被定义的 gender 字段。

# 向 person 中添加数据
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "广东省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true,
  "gender": "男"    # Mapping 中未定义的字段
}

添加成功,搜索 gender 字段:

查看 Mapping 结构:

新添加的字段值,在添加过程中 Mapping 已自动添加字段。

dynamic-false

设置 dynamic 为false时,新增字段数据可以写入,不可以被索引,Mapping 结构会被更新。
同样先将 dynamic 设置为 false,然后向里面添加数据,其他步骤和上面 true 操作一样。定义 Mapping,添加数据。
搜索 gender 字段:

此时新增字段数据无法被索引,但数据可以写入。

Mappnig 也不会添加新增的字段:

dynamic-strict

设置 dynamic 为strict时,从字面上意思也可以看出,对于动态映射是较严格的,新增字段数据不可以写入,不可以被索引,Mapping 结构不会被更新。只能按照定义好的 Mapping 结构添加数据。
在添加新字段数据时,就马上会抛出异常:

自动识别日期类型

上文中,当 dynamic 设置为 true 时,添加新字段数据自动识别类型更新 Mapping,如果是日期类型的话,我们是可以指定识别的类型。
指定 person 的 dynamic_date_formats 格式:

PUT person/_mapping
{
  "dynamic_date_formats": ["yyyy/MM/dd"]
}

这里是可以指定多个时间格式。
向 person 添加新数据,分别是 today 和 firstDate:

PUT person/_doc/2
{
  "today": "2020-01-15",
  "firstDate": "2020/01/15"
}

添加新字段数据后的 Mapping:

由于上面我们指定了时间格式为 yyyy/MM/dd 时是可以识别为时间格式,所以 today 字段的值为 yyyy-MM-dd 格式无法识别为时间类型,判为 text 类型。

多字段

Mapping 中可以定义 fields 多字段属性,以满足不同场景下的实现。比如 address 定义为 text 类型,fields 里面又有定义 keyword 类型,这里主要是区分两个不同不同使用场景。

  • text 会建立分词倒排索引,用于全文检索。
  • keyword 不会建立分词倒排索引,用于排序和聚合。

添加数据:

# 向 person 中添加数据
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "广东省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true
}

查询address数据。

查询address.keyword数据。

通过keyword检索时,由于不会建立分词索引,并没有获取到数据。

控制索引

在字段中使用 index 指定当前字段索引是否能被搜索到。指定类型为 boolean 类型,false 为不可搜索到,true 为可以搜索到。
先删除之前的 Mapping:

DELETE person

创建 Mapping,设置name属性的 index 为 false。

再次添加上面的数据后搜索name字段:

字段 index 设置 false 后,由于没有被索引,所以搜索无法获取到索引。

空值处理

现在向 ElasticSearch 中添加一条 address 为空的数据:

PUT person/_doc/2
{
  "uId": 2,
  "name": "Jack",
  "age": 22,
  "address": null,
  "birthday": "2020-01-15T12:00:00Z",
  "money": 68.7,
  "isStrong": true
}

搜索 address.keyword 为空的数据:

搜索返回异常,默认是不被允许搜索 NUll。
这是需要在 Mapping 指定 null_value 属性,并且不能在text类型中声明。

搜索 address.keyword 为空的数据:

设置 "null_value": "NULL" 后,空值可以处理搜索。

聚合多个字段

聚合多个字段放到一个索引中,使用 copy_to 进行聚合。例如我们在多字段查询中,这是不需要对每个字段进行过滤筛选,只需对聚合字段即可。
在使用 copy_to 时,是通过指定聚合的名称实现。

实际上,copy_to 不使用数组格式添加名称,也会自动转换成数据格式。

添加两条数据,待校验搜索:

# 向 person 中添加数据
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "广东省珠海市",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true
}

PUT person/_doc/2
{
  "uId": 2,
  "name": "杨广东",
  "age": 22,
  "address": null,
  "birthday": "2020-01-15T12:00:00Z",
  "money": 68.7,
  "isStrong": true
}

查询 full_name 的值,会返回 name 和 address 相关的值的对象。

从上面返回结果看到,_source 中的字段没有增加相应的 copy_to 字段名,所以 copy_to 只会拷贝字段内容至索引,并不会改变包含的字段。

总结

通过本文对创建 Mapping 文件的常用并且实用的操作介绍,也基本能掌握这些日常的使用。了解 Mapping 的功能操作,相信对存储时的设计也有一定帮助。

个人博客: https://ytao.top
关注公众号 【ytao】,更多原创好文

我的公众号

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容