Как создать вложенные дикты для создания сопоставления для Elasticsearch от Python? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать отображение, используя 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"}
            }

          }
      }
  }
}

А вот мои данные, полученные из RESTAPI

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

1 голос
/ 25 сентября 2019

Если вы хотите отобразить этот источник из журнала эластичного поиска в конкретную форму, как мы и предполагали в отображении разметки, которое вы показываете в своем посте, обычно вам необходимо создать некую форму рекурсивного посетителя, чтобы иметь возможность использовать его для разногласий спроизвольное вложение и информация о типе полей, если сопоставление может быть применено.

Например, вы можете создать какую-то функцию, как показано ниже:

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

Далее, вызовите функцию наСловарь журналовasticsearch:

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'}
          }
  }}}
1 голос
/ 25 сентября 2019
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"}
            }
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...