2017-05-09 33 views
0

,我想索引的文件是如下這個節點下爲什麼elasticsearch動態模板在映射中創建顯式字段?

{ 
"Under Armour": 0.16667, 
"Skechers": 0.14774, 
"Nike": 0.24404, 
"New Balance": 0.11905, 
"SONOMA Goods for Life": 0.11236 
} 

域是動態的,當文件被獲取添加各種領域(品牌),這意味着將帶着這些文件。

如果我在不指定映射的情況下創建索引,ES表示「已達到最大字段數(1000)」。雖然我們可以增加這個價值,但這不是一個好習慣。

爲了支持上述文檔,我創建瞭如下映射並創建了索引。

{ 
    "mappings": { 
    "my_type": { 
     "dynamic_templates": [ 
     { 
      "template1":{ 
      "match_mapping_type": "double", 
      "match": "*", 
      "mapping": { 
       "type": "float" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

當我將上面的文檔添加到創建的索引並再次檢查索引的映射。它看起來像下面。

{ 
    "my_index": { 
    "mappings": { 
     "my_type": { 
     "dynamic_templates": [ 
      { 
      "template1": { 
       "match": "*", 
       "match_mapping_type": "double", 
       "mapping": { 
       "type": "float" 
       } 
      } 
      } 
     ], 
     "properties": { 
      "New Balance": { 
      "type": "float" 
      }, 
      "Nike": { 
      "type": "float" 
      }, 
      "SONOMA Goods for Life": { 
      "type": "float" 
      }, 
      "Skechers": { 
      "type": "float" 
      }, 
      "Under Armour": { 
      "type": "float" 
      } 
     } 
     } 
    } 
    } 
} 

如果您清楚地看到之前創建的映射以及向索引添加文檔時的映射不同。它添加了靜態添加到映射的字段。當我繼續添加更多的文檔時,新的字段將被添加到映射中(最終將達到最大字段數(1000))。

我的問題是,

  1. 我上面提到的映射是正確的上述文件。
  2. 如果這是正確的,爲什麼新的字段被添加到映射?
+2

在映射你只有根據新的字段類型指定一個動態模板。這只是一種簡單的快捷方式,可以防止您手動添加數十個/數百個字段,但ES會在您的文檔中看到新字段時仍會修改映射。 – Val

+0

@Val感謝您的回覆。爲了遵守這些文件,什麼纔是正確的映射? – udayanga

+0

您的映射是正確的,如果您知道最終會有超過1000個字段,那麼您需要增加該限制或將數據劃分爲差異索引。 – Val

回答

0

根據我閱讀的文章,增加索引字段數並不是一個好習慣,它可能會增加資源使用率。

在這種情況下,當有大量品牌在那裏和新品牌被引入時。

這種情況的適當解決方案是引入鍵值對。 (可能我需要在ETL期間進行轉換)

{ 
    "brands": [ 
    { 
     "key": "Under Armour", 
     "value": 0.16667 
    }, 
    { 
     "key": "Skechers", 
     "value": 0.14774 
    }, 
    { 
     "key": "Nike", 
     "value": 0.24404 
    } 
    ] 
} 

當數據格式如上,地圖不會改變。

良好的閱讀,我發現是 https://www.elastic.co/blog/found-beginner-troubleshooting#keyvalue-woes

感謝@val您的建議

相關問題