elasticsearch 動態模板設置

自定義動態映射

  若是你想在運行時增長新的字段,你可能會啓用動態映射。然而,有時候,動態映射 規則 可能不太智能。幸運的是,咱們能夠經過設置去自定義這些規則,以便更好的適用於你的數據。html

日期檢測

  當 Elasticsearch 遇到一個新的字符串字段時,它會檢測這個字段是否包含一個可識別的日期,好比 2014-01-01 。若是它像日期,這個字段就會被做爲 date 類型添加。不然,它會被做爲 string 類型添加。app

  有些時候這個行爲可能致使一些問題。想象下,你有以下這樣的一個文檔:spa

  {"note": "2014-01-01"}

  假設這是第一次識別 note 字段,它會被添加爲 date 字段。可是若是下一個文檔像這樣:code

  {"note": "Logged out"}

  這顯然不是一個日期,但爲時已晚。這個字段已是一個日期類型,這個 不合法的日期 將會形成一個異常。orm

  日期檢測能夠經過在根對象上設置 date_detection 爲 false 來關閉:htm

PUT /my_index
{
    "mappings": {
        "my_type": {
            "date_detection": false
        }
    }
}

  使用這個映射,字符串將始終做爲 string 類型。若是你須要一個 date 字段,你必須手動添加。對象

  咱們能夠經過如下方式對日期格式的數據進行格式化:blog

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

   可使用 || 分隔多個格式 做爲分隔符。 將依次嘗試每種格式,直到找到匹配的格式。若是不指定,則使用默認格式:ci

  "strict_date_optional_time||epoch_millis"

  默承認以被解析的 date 類型格式以下所示:文檔

  • 包含格式化日期的字符串,例如 「2015-01-01」或「2015/01/01 12:10:30」。
  • 表明milliseconds-since-the-epoch的長整型數。
  • 表明seconds-since-the-epoch的整型數。

  須要注意:以上默認日期類型是在未給定固定類型的狀況下,會按照默認方式自動匹配的。

動態模板

  使用 dynamic_templates ,你能夠徹底控制新檢測生成字段的映射。你甚至能夠經過字段名稱或數據類型來應用不一樣的映射。

  每一個模板都有一個名稱,你能夠用來描述這個模板的用途, 一個 mapping 來指定映射應該怎樣使用,以及至少一個參數 (如 match) 來定義這個模板適用於哪一個字段。

  模板按照順序來檢測;第一個匹配的模板會被啓用。例如,咱們給 string 類型字段定義兩個模板:

    • es :以 _es 結尾的字段名須要使用 spanish 分詞器。

    • en :全部其餘字段使用 english 分詞器。

  咱們將 es 模板放在第一位,由於它比匹配全部字符串字段的 en 模板更特殊:

PUT /my_index
{
    "mappings": {
        "my_type": {
            "dynamic_templates": [
                { "es": {
                      "match":              "*_es",         -- (1)
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "spanish"
                      }
                }},
                { "en": {
                      "match":              "*",            -- (2)
                      "match_mapping_type": "string",
                      "mapping": {
                          "type":           "string",
                          "analyzer":       "english"
                      }
                }}
            ]
}}}
  1. 匹配字段名以 _es 結尾的字段。

  2. 匹配其餘全部字符串類型字段。

  match_mapping_type 容許你應用模板到特定類型的字段上,就像有標準動態映射規則檢測的同樣, (例如 string 或 long)。

  match 參數只匹配字段名稱, path_match 參數匹配字段在對象上的完整路徑,因此 address.*.name 將匹配這樣的字段:

{
    "address": {
        "city": {
            "name": "New York"
        }
    }
}

  unmatch 和 path_unmatch將被用於未被匹配的字段。

相關文章
相關標籤/搜索