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

时间:2017-05-09 13:34:13

标签: 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. 如果正确,为什么要在映射中添加新字段?

1 个答案:

答案 0 :(得分: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提出的建议