概述

在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档。ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mapping)。

动态映射可以通过以下设置来关闭。

PUT /_settings
{
"index.mapper.dynamic":false
}

动态映射的规则也可以自定义,有以下几种我们可以自定义规则的应用场景:

  1. 默认映射(_default_ mapping)
  2. 字段动态映射(dynamic field mapping)
  3. 动态模板(dynamic template)
  4. 索引模板(index template)

其中,前 3 个条件中都是针对特定 index 下的 type 进行设置,而条件 4 是针对所有满足条件的 index 进行设置。

默认映射

默认映射通过把 mapping type 设置为 _default_ 来定义。

默认映射将会应用到该 index 下的任意新增 type 中。

默认映射可以在添加 index 时候设置,也可以创建 index 之后再通过 PUT mapping 接口进行设置。

PUT my_index
{
"mappings": {
"_default_": {
"_all": {
"enabled": false //默认映射禁用掉所有新增 type 的 _all 元数据字段
}
},
"user": {},
"blogpost": {
"_all": {
"enabled": true //覆盖 _default_ 的设置,启用 _all 字段
}
}
}
}

字段动态映射

默认情况,发现新的字段,ES 自动检测其 datatype 并将其加入到 mapping type 中。

通过一些设置,我们可以控制字段动态映射的方式,包括:日期类型检测、数值类型检测、自定义日期类型的格式等。

PUT my_index         //禁用日期类型检测
{
"mappings": {
"my_type": {
"date_detection": false
}
}
}
PUT my_index //自定义日期类型的格式
{
"mappings": {
"my_type": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
}
PUT my_index //启用数值类型检测
{
"mappings": {
"my_type": {
"numeric_detection": true
}
}
}

动态模板

动态模板将会根据条件判断,应用到满足条件的新增字段上去。

应用条件包括:

  1. 用 match_mapping_type 来检测新增字段的数据类型是否满足某种条件
  2. 用 match、unmatch 和 match_pattern 来判断新增字段的字段名是否满足某种条件
  3. 用 path_match 和 path_unmatch 来判断新增字段的完整路径是否匹配某条件

动态模板以数组的形式给出,数组的每一个元素就是一个模板。每个模板都有各自的应用条件,一旦新增的字段满足某个模板,模板内容就会应用到该字段上。

有两个特殊的变量,在模板中可以运用:{name}、{dynamic_type}。前者表示原字段的字段名,后者标识原字段被 ES 自动识别出来的数据类型。

"dynamic_templates": [                 //数组,每个元素都是一个动态模板
{
"my_template_name": { //动态模板名称
... match conditions ... //应用条件判断
"mapping": { ... } //映射设置
}
},
... //多个数组元素标识多个动态模板
]
PUT my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{
"named_analyzers": {
"match_mapping_type": "string",
"match": "*",
"mapping": {
"type": "string",
"analyzer": "{name}"
}
}
},
{
"no_doc_values": {
"match_mapping_type":"*",
"mapping": {
"type": "{dynamic_type}",
"doc_values": false
}
}
}
]
}
}
}

动态模板示例

索引模板

索引模板根据条件来判断新建的索引(只应用到新建索引上)是否满足某条件,并对其进行映射设置。

索引模板包含一些对索引的设置和映射设置。

在索引模板中有一个特殊变量可以运用:{index}。表示匹配上条件的原索引名称。

PUT /_template/template_1
{
"template": "te*", //判断条件,判断哪些索引将应用该模板
"settings": { //索引设置
"number_of_shards":
},
"mappings": { //映射设置
"type1": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "string",
"index": "not_analyzed"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z YYYY"
}
}
}
}
}

mapping 详解5(dynamic mapping)的更多相关文章

  1. mapping 详解1(mapping type)

    映射(mapping) 映射是定义一个文档以及其所包含的字段如何被存储和索引的方法. 例如,用映射来定义以下内容: 哪些 string 类型的 field 应当被当成当成 full-text 字段 哪 ...

  2. mapping 详解4(mapping setting)

    mapping type 映射设置一般发生在: 1. 增加新的 index 的时候,添加 mapping type,对 fields 的映射进行设置 PUT twitter { "mappi ...

  3. mapping 详解2(field datatypes)

    基本类型 1. 字符串 字符串类型被分为两种情况:full-text 和 keywords. full-text 表示字段内容会被分析,而 keywords 表示字段值只能作为一个精确值查询. 参数: ...

  4. ElasticSearch7.3 学习之Mapping核心数据类型及dynamic mapping

    1.mapping的核心数据类型以及dynamic mapping 1.1 核心的数据类型 string :text and keyword,byte,short,integer,long,float ...

  5. mapping 详解3(Meta-Fields)

    文档标识相关元数据字段 _index 当执行多索引查询时,可能需要添加特定的一些与文档有关联的索引的子句. _index 字段可以用在 term.terms 查询,聚合(aggregations)操作 ...

  6. Elasticsearch5.X Mapping详解

    0.引言 在关系型数据库如Mysql中,设计库表需要注意的是: 1)需要几个表: 2)每个表有哪些字段: 3)表的主键及外键的设定——便于有效关联. 表的设计遵守范式约束,考虑表的可扩展性,避免开发后 ...

  7. Pytest 系列(29)- 详解 allure.dynamic 动态生成功能

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 @allure.title  ...

  8. 65.dynamic mapping

    主要知识点: 理解dynamic mapping 定制dynamic mapping 更改default dynamic mapping     一.理解dynamic mapping 1.基本概念 ...

  9. ES 12 - 配置使用Elasticsearch的动态映射 (dynamic mapping)

    目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2. ...

随机推荐

  1. 在 MacOS 上编译链接 OpenGL 程序

    几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...

  2. CentOS 7.0 安装 python3.X 脚本

    #!/bin/sh #第一个Linux下的脚本,太多不明白的地方,只是依着网上的例子照葫芦画瓢,能正常运行即可 #运行环境 CentOS 7.0 版本 #首行指定程序的路径,以#号开头的行是注释行 # ...

  3. POJ 3254 poj3254 Corn Fields

    题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 思路: DP[i][j]=sum(dp[i-1][k]); i表示当前 ...

  4. 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术

    大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为了能够更好的架构大数据项目,这里整理一下,供技术人员,项目经理,架构师选 ...

  5. Spring MVC返回JSON数据

    将一个对象以json数据格式返回前台: @ResponseBody public  User login(User user) { return user; } 在控制器上使用@ResponseBod ...

  6. 自定义实现MPVolumeView音量控件

    http://blog.csdn.net/theonezh/article/details/8158420 http://www.cnblogs.com/cate/ios/ http://www.cn ...

  7. jq向上无缝滚动

    <!-- -------------摇奖排行榜--------------- --> <div class="Top_Record"> <div cl ...

  8. 我的JS 类 写法

    长这样! var p,p1; //构造函数 function Person(name) { this.name = name; } //原型对象 var proto = { getName : fun ...

  9. 【WIN32进阶之路】:内存映射文件

    第一章:源起  遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决 ...

  10. SQLite使用教程4 创建数据库

    http://www.runoob.com/sqlite/sqlite-create-database.html SQLite 创建数据库 SQLite 的 sqlite3 命令被用来创建新的 SQL ...