为什么elasticsearch动态模板在映射中创建显式字段?

问题描述:

,我想索引的文件是如下这个节点下为什么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

根据我阅读的文章,增加索引字段数并不是一个好习惯,它可能会增加资源使用率。

在这种情况下,当有大量品牌在那里和新品牌被引入时。

这种情况的适当解决方案是引入键值对。 (可能我需要在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您的建议