ES - Dynamic templates 動態模板


1、ES Mapping

在lucene中,索引中每個字段都需要指定很多屬性,例如:是否分詞、采用哪個分詞器、是否存儲等。

在ES中,其實索引中每個字段也需要指定這些屬性,我們有時候並沒有對這些屬性進行設置,這得益於ES的動態映射(Dynamic Mapping)。

參考:Dynamic Mapping

Dynamic Mapping可以解決一部分場景,但有時候ES並不能很好的理解我們的業務數據,這時就需要我們自己指定這些屬性(Explicit Mapping)。

例如:

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 Mapping

 

2、Dynamic templates

之前我們簡單聊過Dynamic field mapping,這種方式下字段的映射規則基本都是ES自己決定的。 

如果我們不想完全受ES的“控制”,又不想每個字段都自己指定,有什么辦法呢?

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、實例說明

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM