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

相關文章
相關標籤/搜索