如何创建嵌套字典以便通过 Python 为 Elasticsearch 创建映射?

我正在尝试使用 Loop 创建映射来处理嵌套字典。


我的映射表应该看起来像下面的值。


 { 

    "mapping": {

    "properties": {

        "clusterName": {

            "properties": {

                "infoAddr": { "type": "string" },

                "usedSpace": { "type": "string" },

                "capacity": { "type": "int" },

                "version": { "type": "string"},

                "used": { "type": "int"},

                "remaining": { "type" : "int"},

                "volfails": { "type": "int"}

            }


          }

      }

  }

}

这是我从 REST API 获得的数据


{

    "test.mydomain_1.xyz:1019": {

                                "infoAddr":"x.x.x.x:1022",

                                "usedSpace":384635032546,

                                "capacity":30697676811776,

                                "version":"2.7.3.2.6.5.23-1",

                                "used":384635032546,

                                "remaining":30311575148182,

                                "volfails":0 },

    "test.mydomain_2.xyz:1019": {

                                "infoAddr":"x.x.x.x:1022",

                                "usedSpace":384635032546,

                                "capacity":30697676811776,

                                "version":"2.7.3.2.6.5.23-1",

                                "used":384635032546,

                                "remaining":30311575148182,

                                "volfails":0 }

}

现在我有清单


1. clusterName = ("test.mydomain_1.xyz:1019", "test.mydomain_2.xyz:1019",..."test.mydomain_n.xyz:1019")

2. Properties under properties field = ("infoAddr", "usedSpace",..."volfails")

3. Type of values from properties = ("str","str",..."int")

请建议我如何使用循环从这些数据创建映射,以便自动创建此映射。


白衣非少年
浏览 283回答 2
2回答

沧海一幻觉

result = {}for cluster_name, data in a.items():    type_data = {key: {'type': type(value).__name__} for key, value in data.items()}    result[cluster_name] = type_datamapping = {"mapping": {"properties": result}}因此,提供的数据的输出将是:{    "mapping":{        "properties": {        "test.mydomain_1.xyz:1019": {            "infoAddr": {"type": "str"},             "usedSpace": {"type": "int"},            "capacity": {"type": "int"},             "version": {"type": "str"},            "used": {"type": "int"},             "remaining": {"type": "int"},            "volfails": {"type": "int"}},        "test.mydomain_2.xyz:1019": {            "infoAddr": {"type": "str"},             "usedSpace": {"type": "int"},            "capacity": {"type": "int"},            "version": {"type": "str"},            "used": {"type": "int"},             "remaining": {"type": "int"},            "volfails": {"type": "int"}            }        }    }}

四季花海

如果您想将该源从弹性搜索日志映射到特定形式,我们打算在您在帖子中显示的 dict 映射中,通常,您需要创建某种形式的递归访问者,以便能够将其用于具有任意嵌套的 dicts 和如果可以应用映射,则有关字段类型的信息。例如,您可以创建某种函数,如下所示:def visit(data):    data_mapping = {}    for data_key, data_value in data.items():        if isinstance(data_value,dict):            if data_key not in data_mapping:                data_mapping[data_key] = {'properties': {}}            data_mapping[data_key]['properties'] = visit(data_value)        else:            data_mapping[data_key] = {                'type': data_value.__class__.__name__            }    return data_mapping接下来,调用 elasticsearch 日志字典上的函数:mapping = visit(data)mapping = {'mapping': { 'properties': mapping}}因此,输出将是:{'mapping': { 'properties': {  'test.mydomain_1.xyz:1019': {       'properties': {             'infoAddr': {'type': 'str'},             'usedSpace': {'type': 'int'},             'capacity': {'type': 'int'},             'version': {'type': 'str'},             'used': {'type': 'int'},             'remaining': {'type': 'int'},             'volfails': {'type': 'int'}        }  }, 'test.mydomain_2.xyz:1019': {         'properties': {               'infoAddr': {'type': 'str'},               'usedSpace': {'type': 'int'},               'capacity': {'type': 'int'},               'version': {'type': 'str'},               'used': {'type': 'int'},               'remaining': {'type': 'int'},               'volfails': {'type': 'int'}          }  }}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python