ES - Dynamic templates 动态模板

一、ES Mappinghtml

在lucene中,索引中每一个字段都须要指定不少属性,例如:是否分词、采用哪一个分词器、是否存储等。正则表达式

在ES中,其实索引中每一个字段也须要指定这些属性,咱们有时候并无对这些属性进行设置,这得益于ES的动态映射(Dynamic Mapping)。app

参考:Dynamic Mappingelasticsearch

Dynamic Mapping能够解决一部分场景,但有时候ES并不能很好的理解咱们的业务数据,这时就须要咱们本身指定这些属性(Explicit Mapping)。ide

例如:ui

PUT my_index 
{
  "mappings": {
    "doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}

参考:Put Mappingspa

 

二、Dynamic templatescode

以前咱们简单聊过Dynamic field mapping,这种方式下字段的映射规则基本都是ES本身决定的。 orm

若是咱们不想彻底受ES的“控制”,又不想每一个字段都本身指定,有什么办法呢?htm

Dynamic template可让咱们制定一些规则,知足这个需求。

"dynamic_templates": [
    {
      "my_template_name": { 
        ...  match conditions ... 
        "mapping": { ... } 
      }
    },
    ...
  ]

a)my_template_name:模板的名称

b)match conditions:匹配规则

c)mapping:匹配后的mapping规则

 

2.1 匹配规则

2.1.1 match_mapping_type

这里能够改变ES的想法!原本ES以为这个字段应该映射成long,那么咱们能够修改为integer。

例如:

PUT my_index
{
  "mappings": {
    "_doc": {
      "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
                }
              }
            }
          }
        }
      ]
    }
  }
}

 

2.1.2 match and unmatch

这里主要是对字段名称进行匹配处理。

例如咱们想对全部string类型、以long开头、并不以text结尾的字段改为long类型,以下:

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "longs_as_strings": {
            "match_mapping_type": "string",
            "match":   "long_*",
            "unmatch": "*_text",
            "mapping": {
              "type": "long"
            }
          }
        }
      ]
    }
  }
}

 

这里match还支持正则表达式,例如:

"match_pattern": "regex",
"match": "^profit_\d+$"

 

2.1.3 path_match and path_unmatch

这里主要是针对对象类型(object)的匹配规则。详细内容参见官方文档。

 

三、实例说明

3.1 ES默认string类型字段会被映射成text和keyword(sub_field),若是咱们想只映射成keyword(用来过滤、排序、统计等),该如何处理?

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "strings_as_keywords": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}

 

 

参考:

ES Mapping

相关文章
相关标签/搜索