为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2022-06-07 19:29:00
我正在尝试使用 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")请建议我如何使用循环从这些数据创建映射,以便自动创建此映射。
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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_data


mapping = {"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"}

            }

        }

    }

}


查看完整回答
反对 回复 2022-06-07
?
四季花海

TA贡献1811条经验 获得超5个赞

如果您想将该源从弹性搜索日志映射到特定形式,我们打算在您在帖子中显示的 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'}

          }

  }}}


查看完整回答
反对 回复 2022-06-07
  • 2 回答
  • 0 关注
  • 282 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号