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

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

elasticsearch 为什么elasticsearch动态模板在映射中创建显式字段?,elasticsearch,elasticsearch,我要索引的文档如下 { "Under Armour": 0.16667, "Skechers": 0.14774, "Nike": 0.24404, "New Balance": 0.11905, "SONOMA Goods for Life": 0.11236 } 此节点下的字段是动态的,这意味着在添加文档时,这些文档将附带各种字段(品牌) 如果我在没有指定映射的情况下创建索引,ES会说“已达到最大字段数(1000)”。虽然我们可以增加这个值,但这不是一个好的做法 为了支持上面的文

我要索引的文档如下

{
 "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))

我的问题是,

  • 我上面提到的映射对于上述文档是正确的
  • 如果正确,为什么要向映射中添加新字段

  • 根据我读到的帖子,增加索引中的字段数量不是一个好的做法,它可能会增加资源的使用

    在这种情况下,当有大量的品牌存在和新的品牌推出

    对于这种情况,正确的解决方案是引入键值对。(可能我需要在ETL期间进行转换)

    当数据按上述格式格式化时,地图不会更改

    我找到的一本好书是


    感谢@Val的建议

    在映射中,您只指定了基于新字段类型的动态模板。这只是一个快捷方式,可以防止您手动添加几十个/数百个字段,但ES在文档中看到新字段时仍会修改映射。@Val感谢您的回复。为了符合这些文档的要求,正确的映射是什么?您的映射是正确的,如果您知道最终会有1000多个字段,那么您需要增加该限制或将数据划分为不同的索引。为什么不简单地更改文档的结构,使其具有品牌名称和浮点值<代码>{“品牌”:“盔甲下”,“价值”:0.16667}???这样你就可以拥有数以百万计的品牌,而不用担心现场数量。
    {
      "brands": [
        {
          "key": "Under Armour",
          "value": 0.16667
        },
        {
          "key": "Skechers",
          "value": 0.14774
        },
        {
          "key": "Nike",
          "value": 0.24404
        }
      ]
    }