ElasticSearch动态映射实战详解

2023-02-01 09:16:45
目录
什么是动态映射映射规则日期规则数字检测动态映射模板match_mapping_typematch、unmatchmatch_patternpath_match、path_unmatch{name}、{dynamic_type}直接指定类型索引模板结束语

什么是动态映射

通俗的讲,就是文档中的字段类型可以由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>时,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、match_pattern时,当字段名称不匹配unmatchpath_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>