亲宝软件园·资讯

展开

ElasticSearch 动态映射实战详解

程序员皮卡秋 人气:0

什么是动态映射

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

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

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

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

映射规则

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

日期规则

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

PUT my_index
{
"mappings": {
  "dynamic_date_formats": ["MM/dd/yyyy"]
}
}

数字检测

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

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

动态映射模板

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

下面看一些示例:

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符合以下规则:

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

结束语

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

加载全部内容

相关教程
猜你喜欢
用户评论