ElasticSearch动态Mappings详解

Elasticsearch

mappings 动态映射

Dynamic fieid mappings 默认情况下是根据es支持的数据类型类推测参数的类型,而动态模板允许您定义自定义映射规则,根据自定义的规则来推测字段值所属的类型,从而添加字段类型映射。

{
    "dynamic_templates": [  // 1
        {
            "my_template_name": {   //2
                match conditions ,  //3
                "mapping": {        //4
                    "type": "keyword"
                }
            }
        }
    ]
}
  1. 在类型映射时通过dynamic_templates属性定义动态映射模板,其类型为数据
  2. 定义动态映射模板名称
  3. 匹配条件,其定义方式包括:match_mapping_type,match,match_pattern,unmatch,path_match,path_unmatch
  4. 匹配3的字段使用类型映射定义(映射参数为类型映射中支持的参数)

动态类型模板映射机制

  1. match_mapping_type

    使用JSON解析器解析字段值的类型,由于JSON不能区分long和integer,也不允许区分double和float,所以它总是选择更广泛的数据类型,在使用字段动态映射时,es会将字段动态映射为long而不是integer类型,那如何将数字5动态映射为integer类型呢,利用match_mapping_type可以实现,如果将所有整数字段映射为整数而不是long,并将所有字符串字段映射为文本和关键字。。

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

    match_mapping_type为字段动态映射(字段类型检测)得出的类型建立一个映射关系,将该类型转换为mapping定义中的类型。

  2. match and unmatch

    1. match 参数使用模式匹配字段名,而unmatch使用模式排除匹配的字段。

      PUT my_index
      {
          "mappings": {
              "_doc": {
                  "dynamic_templates": [
                      {
                          "longs_as_strings": {
                              "match_mapping_type": "string",        //1
                              "match": "*",                    //2
                              "unmatch": "*_text",              //3
                              "mapping": {                     //4
                                  "type": "integer"
                              }
                          }
                      }
                  ]
              }
          }
      }
      PUT my_index/_doc/1
      {
        "long_num": "5",       //5
        "long_text": "foo"      //6
      }
      
      1. 表示该自动映射模板针对的字段为JSON解析器检测字段的类型为string的新增字段。
      2. 字段名称以long_开头的字段。
      3. 排除字段名称以_text的字段。
      4. 符合long_开头的字段,并不是以_text结尾的字段,如果JSON检索为string类型的新字段,映射为long。
      5. long_num,映射类型为long。
      6. long_text满足long_ 开头,但是以 _text结尾,故该字段不会映射为long,而是保留其JSON检测到的类型string,会映射为text字段和keyword多字段。
  3. match_pattern

    1. 使用正则表达式来匹配字段名称。

      {
          "dynamic_templates": [
              {
                  "longs_as_strings": {
                      "match_mapping_type": "string",
                      "match_pattern": "regex", //1
                      "match":"^profit_\d+$",       //2
                      "mapping": {
                          "type": "long"
                      }
                  }
              }
          ]
      }
      
      1. 设置匹配模式为regex代表Java正则表达式
      2. Java正则表达式
  4. patch_match and path_unmatch

    1. path_match 与 path_unmatch的工作方式与match,unmatch一样,只不过path_match是针对字段的全路径,特别是针对嵌套类型

      例子:将name下的字段除了middle字段为copy到name属性并列的full_name字段中。

      PUT my_index
      {
          "mappings": {
              "_doc": {
                  "dynamic_templates": [
                      {
                          "copy_full_name": {
                              "path_match": "name.*",
                              "path_unmatch": "*.middle",
                              "mapping": {
                                  "type": "text",
                                  "copy_to": "full_name"
                              }
                          }
                      }
                  ]
              }
          }
      }
      PUT my_index/_doc/1
      {
          "name": {
              "first": "Alice",
              "middle": "Mary",
              "last": "White"
          }
      }
      
  5. {name} and {dynamic_type}

    1. {name}展位符,表示字段的名称。

    2. {dynamic_type}:JSON解析器解析到字段类型。

      PUT my_index
      {
          "mappings": {
              "_doc": {
                  "dynamic_templates": [
                      {
                          "named_analyzers": {      //1
                              "match_mapping_type": "string",
                              "match": "*",
                              "mapping": {
                                  "type": "text",
                                  "analyzer": "{name}"
                              }
                          }
                      },
                      {
                          "no_doc_values": {            //2
                              "match_mapping_type": "*",
                              "mapping": {
                                  "type": "{dynamic_type}",
                                  "doc_values": false
                              }
                          }
                      }
                  ]
              }
          }
      }
      PUT my_index/_doc/1
      {
        "english": "Some English text", 
        "count":   5 
      }
      
      1. 映射模板的含义为:对所有匹配到的字符串类型,类型映射为text,对应的分析器的名称与字段名相同,这个在使用时慎重,可能不存在同名的分词器。
      2. 对于匹配到的任何类型,其映射定义为类型为自动检测的类型,并且禁用doc_values=false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,627评论 6 517
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,180评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,346评论 0 362
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,097评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,100评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,696评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,165评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,108评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,646评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,709评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,861评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,527评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,196评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,698评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,804评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,287评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,860评论 2 361