ElasticSearch 动态映射实战详解

 更新时间:2023年01月31日 14:32:49   作者:程序员皮卡秋  
这篇文章主要为大家介绍了ElasticSearch 动态映射实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是动态映射

通俗的讲,就是文档中的字段类型可以由ES动态识别,无需在创建索引的时候规定字段的类型。

比如在项目中,如果不确定字段数据类型的情况下,可以使用动态映射,ES可以利用动态映射来决定该字段的类型,并自动把该字段添加到映射中。

在使用的时候要结合实际业务来考虑,如果将 ES 当作主要的数据存储使用,并且希望出现未知字段时抛出异常,那么开启动态 mapping 并不适用。

***在不确定索引类型字段时,可以先创建临时索引,然后存储数据,查询映射。再删除临时索引。这样就得到数据的基本映射了,可以在其上做精细化修改。 ***

映射规则

  • null 没有字段被添加
  • true or false boolean 类型
  • 浮点类型数字 float 类型
  • 数字 long 类型
  • JSON 对象 object 类型
  • 数组 由数组中第一个非空值决定
  • string 有可能是 date 类型(若开启日期检测)、double 或 long 类型、text 类型、keyword 类型

在 mapping 中可以通过 dynamic 设置来控制是否自动新增字段,接受以下参数:

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

日期规则

es中当字符串的格式为:yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z时,es动态模板会自动认为该字符串为日志类型

  • 可以通过date_detection来关闭日期模板匹配
  • 可以通过dynamic_date_formats来指定日期字符匹配模板
PUT my_index
{
"mappings": {
  "dynamic_date_formats": ["MM/dd/yyyy"]
}
}

数字检测

动态映射有时会将数字映射为字符串类型,可以通过开启数字检测来解决该问题

PUT my_index
{
"mappings": {
  "numeric_detection": true
}
}

动态映射模板

定义动态映射模板,来格式化动态映射的规则,动态映射模板包含以下关键字:

  • match_mapping_type:用来匹配当前映射的字段类型。可以理解为,当字段类型为match_mapping_type时
  • match、unmatch 、match_pattern:用来匹配当前映射字段的名称。可以理解为,当字段名称匹配match、match_pattern时,当字段名称不匹配unmatch
  • path_match、path_unmatch:用来匹配当前映射字段的路径,通常用来匹配嵌套字段。可以理解为,当字段路径为path_match时,当字段路径不匹配path_unmatch
  • {name}, {dynamic_type} :用来进行占位符匹配,具体怎么用,都可以,但是最终映射的值为name或动态类型 当然也可以直接强制指定类型和属性

下面看一些示例:

match_mapping_type

dynamic_templates是动态模板名称,什么字段都可以。integersstrings时动态模板项名称

PUT my_index
{
"mappings": {
 "dynamic_templates": [
   {
     "integers": {
       "match_mapping_type": "long",
       "mapping": {
         "type": "integer"
       }
     }
   },
   {
     "strings": {
       "match_mapping_type": "string",
       "mapping": {
         "type": "text",
         "fields": {
           "raw": {
             "type":  "keyword",
             "ignore_above": 256
           }
         }
       }
     }
   }
 ]
}
}

match、unmatch

PUT my_index
{
"mappings": {
 "dynamic_templates": [
   {
     "longs_as_strings": {
       "match":   "long_*",
       "unmatch": "*_text",
       "mapping": {
         "type": "long"
       }
     }
   }
 ]
}
}

match_pattern

{
"mappings": {
 "dynamic_templates": [
   {
     "longs_as_strings": {
       "match_pattern": "regex",  
       "match": "^profit_\d+$",
       "unmatch": "*_text",
       "mapping": {
         "type": "long"
       }
     }
   }
 ]
}
}

path_match、path_unmatch

{ 
    "mappings": { 
        "dynamic_templates": [ 
            {
                "full_name": {
                    "path_match": "name.*",
                    "path_unmatch": "*.middle",
                    "mapping": {
                        "type": "text",
                        "copy_to": "full_name"
                    }
                }
            } 
        ] 
    } 
}

{name}、{dynamic_type}

{
  "mappings": {
    "dynamic_templates": [
      {
        "named_analyzers": {
          "match_mapping_type": "string",
          "match": "*",
          "mapping": {
            "type": "text",
            "analyzer": "{name}"
          }
        }
      },
      {
        "no_doc_values": {
          "match_mapping_type":"*",
          "mapping": {
            "type": "{dynamic_type}",
            "doc_values": false
          }
        }
      }
    ]
  }
}

直接指定类型

{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

索引模板

索引模板的作用是提前创建好模板,后续索引的创建会根据匹配规则,自动生成该索引的配置

  • 模板只在索引创建时起作用,修改模板不会影响已创建的索引。
  • 可以设置多个索引模板,这些设置会被 merge 在一起。
  • 可以设置 order 的数值,控制 merge 的过程。

当一个索引被创建时,如果符合多个模板,那么模板之间merge符合以下规则:

  • order 值高的模板会覆盖 order 值低的模板。
  • 相同字段会覆盖
  • 不同字段会叠加

感兴趣的同学,可以自行去查询相关文档,这个不是很常用

结束语

本节主要讲了ES中的动态mapping概念以及它的相关属性。下节给大家讲ES中文档相关的API操作

以上就是ElasticSearch 动态映射实战详解的详细内容,更多关于ElasticSearch 动态映射的资料请关注脚本之家其它相关文章!

相关文章

  • 为spring get请求添加自定义的参数处理操作(如下划线转驼峰)

    为spring get请求添加自定义的参数处理操作(如下划线转驼峰)

    这篇文章主要介绍了为spring get请求添加自定义的参数处理操作(如下划线转驼峰),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 基于openeuler的DataGear部署文档

    基于openeuler的DataGear部署文档

    本文详细介绍了如何在openEuler操作系统上安装和配置JDK以及DataGear,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • Java的SpringMVC中控制器返回XML数据问题

    Java的SpringMVC中控制器返回XML数据问题

    这篇文章主要介绍了Java的SpringMVC中控制器返回XML数据问题,控制器是处理HTTP请求的组件,它们接收来自客户端的请求,并将其转换为适当的响应,这些响应可以是动态生成的 HTML 页面,也可以是JSON或XML格式的数据,需要的朋友可以参考下
    2023-07-07
  • java中struts2实现文件上传下载功能

    java中struts2实现文件上传下载功能

    这篇文章主要介绍了java中struts2实现文件上传下载功能的方法,以实例形式分析了struts2文件上传下载功能的实现技巧与相关问题,具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • Jenkins安装多个jdk版本并在项目中选择对应jdk版本

    Jenkins安装多个jdk版本并在项目中选择对应jdk版本

    在使用jenkins构建项目时会遇到不同的job需要配置不同版本的jdk,下面这篇文章主要给大家介绍了关于Jenkins安装多个jdk版本并在项目中选择对应jdk版本的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java中集合和数组的排序方式小结

    Java中集合和数组的排序方式小结

    这篇文章主要介绍了Java中集合和数组的排序方式小结,本文讲解了对数字数组、字符数组排序以及集合序列的排序,需要的朋友可以参考下
    2015-01-01
  • 详解spring boot配置 ssl

    详解spring boot配置 ssl

    本篇文章主要介绍了详解spring boot配置 ssl,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Spring Boot和Kotlin的无缝整合与完美交融

    Spring Boot和Kotlin的无缝整合与完美交融

    这篇文章主要给大家介绍了关于Spring Boot和Kotlin的无缝整合与完美交融的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Java内存屏障详解

    Java内存屏障详解

    文章主要介绍了内存屏障的必要性,以及在多核处理器中如何通过内存屏障来保证多线程程序的内存可见性和防止指令乱序执行,文章还详细解释了内存屏障的作用、原理以及常见处理器中的重排序类型
    2025-01-01
  • Java中Cookie和Session的那些事儿

    Java中Cookie和Session的那些事儿

    Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计。这篇文章主要介绍了java中cookie和session的知识,需要的朋友可以参考下
    2016-09-09

最新评论