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 动态映射的资料请关注脚本之家其它相关文章!

你可能感兴趣的:(ElasticSearch 动态映射实战详解)