ES7学习笔记(五)动态映射
通常情况下,我们使用ES建立索引的步骤是,先创建索引,然后定义索引中的字段以及映射的类型,然后再向索引中导入数据。而动态映射是ES中一个非常重要的概念,你可以直接向文档中导入一条数据,与此同时,索引、字段、字段类型都会自动创建,无需你做其他的操作。这就是动态映射的神奇之处。
动态字段映射
ES的动态映射默认是开启的,动态映射的默认规则如下:
| JSON的数据类型 | ES中的数据类型 |
|---|---|
| null | 不会映射字段 |
| true 或 false | boolean类型 |
| 浮点型数字 | float |
| 整型数字 | long |
| JSON对象 | Object |
| 数组 | 第一个非空值得类型 |
| String | 1、如果满足日期类型的格式,映射为日期类型 |
| 2、如果满足数字型的格式,映射为long或者float | |
| 3、如果就是字符串,会映射为一个text类型和一个keyword类型 |
接下来我们看看动态映射的一个例子,我们直接向dynamic-index索引中存放一条数据,注意,dynamic-index这个索引我们没有创建过,直接存放数据,索引会自动创建。接下来,我们看一下具体的请求:
PUT /dynamic-index/_doc/1
{
"my_null": null,
"my_boolean": false,
"my_float": 1.56,
"my_long": 3,
"my_object": {
"my_first": "first value",
"my_second": "second_value"
},
"my_array": [1,2,3],
"my_date_1": "2020-05-01",
"my_date_2": "2020/05/01 12:03:03",
"my_date_3": "05/01/2020",
"my_string_long": "1",
"my_string_float": "4.6",
"my_string": "中华人民共和国"
}
请求执行成功以后,我们先看一下索引的类型:
GET /dynamic-index/_mapping
返回的结果如下:
{
"dynamic-index": {
"mappings": {
"properties": {
"my_array": {
"type": "long"
},
"my_boolean": {
"type": "boolean"
},
"my_date_1": {
"type": "date"
},
"my_date_2": {
"type": "date",
"format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"my_date_3": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_float": {
"type": "float"
},
"my_long": {
"type": "long"
},
"my_object": {
"properties": {
"my_first": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_second": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"my_string": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_string_float": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_string_long": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
返回的结果比较长,我们把每一个字段都看一下,看看动态映射的字段是否达到了我们的预期:
| 字段 | 映射结果 | 是否达到预期 | 原因 |
|---|---|---|---|
| my_null | 没有映射 | 是 | null值不映射 |
| my_boolean | boolean | 是 | |
| my_float | float | 是 | |
| my_long | long | 是 | |
| my_object | object | 是 | my_object里自动生成了两个字段的映射 |
| my_array | long | 是 | 数组中的数字是long型 |
| my_date_1 | date | 是 | |
| my_date_2 | date | 是 | |
| my_date_3 | text | 否 | 没有指定这种日期格式,所以映射为text |
| my_string_long | text | 否 | 数字探测默认关闭,没有打开 |
| my_string_float | text | 否 | 数字探测默认关闭,没有打开 |
| my_string | text | 是 | 普通字符串,映射为text |
下面我们把数字探测打开,执行如下请求:
PUT /dynamic-index
{
"mappings": {
"numeric_detection": true
}
}
由于我们的索引dynamic-index中,存在了映射关系,再进行设置是会报错的,所以我们要将索引删除,执行如下请求:
DELETE /dynamic-index
索引删除成功后,再执行前面的设置,执行成功,数字探测已经打开。然后再添加一种日期格式MM/dd/yyyy,请求如下:
PUT /dynamic-index
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
执行报错,错误信息和之前一样,看来日期的设置要和数字探测一起才行,我们再将索引删除,然后再发送请求,两个设置一起:
PUT /dynamic-index
{
"mappings": {
"numeric_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
执行成功,我们再发送之前创建索引数据的请求
PUT /dynamic-index/_doc/1
{
"my_null": null,
"my_boolean": false,
"my_float": 1.56,
"my_long": 3,
"my_object": {
"my_first": "first value",
"my_second": "second_value"
},
"my_array": [1,2,3],
"my_date_1": "2020-05-01",
"my_date_2": "2020/05/01 12:03:03",
"my_date_3": "05/01/2020",
"my_string_long": "1",
"my_string_float": "4.6",
"my_string": "中华人民共和国"
}
执行成功,我们再看一下索引的映射,
"my_string_float": {
"type": "float"
},
"my_string_long": {
"type": "long"
}
"my_date_1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_date_2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_date_3": {
"type": "date",
"format": "MM/dd/yyyy"
},
我们重点看一下以上几个字段,my_string_float和my_string_long映射成我们想要的类型了,由于我们开启了数字探测。再看看我们映射的3个日期类型,咦?只有my_date_3映射了日期类型,其他两个都是映射成了text类型,这是由于我们在设置dynamic_date_formats时,只指定了一种格式。我们只需要把其他两种类型的日期格式也加上就可以了。
{
"mappings": {
"numeric_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd"]
}
}
这里就不给大家具体演示了,有兴趣的小伙伴去尝试一下吧。
动态字段是ES中一个非常重要的功能,它给我们带来了极大的方便,也省去了我们在开发时创建索引字段的时间,真是事半功倍,小伙伴们要好好掌握哦~~
ES7学习笔记(五)动态映射的更多相关文章
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- MyBatis:学习笔记(4)——动态SQL
MyBatis:学习笔记(4)——动态SQL 如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情.MyBatis提供了对SQL语句动态的组装能力,而且他只有 ...
- mybatis学习笔记(7)-输出映射
mybatis学习笔记(7)-输出映射 标签: mybatis mybatis学习笔记7-输出映射 resultType 输出简单类型 输出pojo对象和pojo列表 resultMap result ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- Web Service学习笔记:动态调用WebService
原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
随机推荐
- SpringBoot项目启动执行任务的几种方式
1.直接在启动类下面调用方法 @SpringBootApplication public class TestApplication { public static void main(String[ ...
- git push提交出现Everything up-to-date提示问题
以前通过git提交代码到GitHub上的个人main分支时,曾出现过这样一个很低级的错误-- 出现这个错误原因,其实就是没有正确执行指令造成的,也就是没有正常提交数据. 一般按照以下命令提交,基本就没 ...
- saltStack自动化工具
目录 SaltStack自动化工具 核心概念 1. Master 和 Minion 2. State 3. Pillar 4. Grains 5. Modules 6. Runner 7. React ...
- 委托之Action与Func
1 例程代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- 数据仓库建模工具之一——Hive学习第二天
Hive的概述 1.Hive基本概念 1.1 Hive简介 Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为Map ...
- Standard Template Libary or C++ Standard Library
C++提供一套标准的library称为C++ standard library完全以template完成,所以又被称为Standard Template Library.这套library专门有于实现 ...
- 学习笔记--Java中final关键字
Java中final关键字 关于Java语言中的final关键字: final是一个关键字,表示:最终的,不可改变 final修饰的类无法被继承 final修饰的方法无法被覆盖 final修饰的变量一 ...
- ORA-01658创建表或索引报错分析
一.报错信息 某项目最近在 SQL Loader 导数据时偶尔会报错,类似如下: SQL loader ORA-01658 unable to creale INITIAL extent for se ...
- web3 产品介绍 MyEtherWallet 方便和智能合约交互的钱包
MyEtherWallet(简称MEW)是一款流行的去中心化以太坊钱包,它允许用户在安全且简单的界面中管理自己的以太坊资产.在本文中,我们将介绍MyEtherWallet的主要特点.功能以及如何使用它 ...
- 【DataBase】MySQL 07 SQL函数 单行函数其一 字符函数
SQL函数的概念 -- SQL函数 -- 概念:类似Java的方法,将已经定义好的不再改变的逻辑语句封装在函数体内,对外提供方法的标识 -- 隐藏了实现细节,提高功能的可重用 -- SELECT 函数 ...