开发者

ElasticSearch 动态映射实战详解

目录
  • 什么是动态映射
    • 映射规则
    • 日期规则
    • 数字检测
  • 动态映射模板
    • match_mapping_type
    • match、unmatch
    • match_pattern
    • path_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 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:用来匹配当前映射字段的名称。可以理解为,当字段名称www.devze.com匹配match、match_pattern时,当字段名称不匹配unmatch
      • path_match、path_unmatch:用来匹配当前映射字段的路径,通常用来匹配嵌套字段。可以理解为,当字段路径为path_match时,当python字段路径不匹配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"http://www.devze.com
                          }
                      }
                  } 
              ] 
          } 
      }
      

      {name}、{dynamic_type}

      {
        "mappings": http://www.devze.com{
          "dynamic_templates": [
            {
              "named_analyzers": {
               开发者_JS开发 "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 动态映射的资料请关注我们其它相关文章!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜