Elasticsearch数据更加结构化

时间:2016-11-21 09:50:16

标签: python elasticsearch elasticsearch-aggregation

我有两个字段子聚合:`[' field1',' field2']。这两个字段都是术语聚合。对于所有这些存储桶以及嵌套和存储桶嵌套,elasticsearch返回聚合的方式并不方便。我在将弹性搜索结果转换为dicts列表时遇到了麻烦,例如

elasticsearch假结果:

'aggregations':{
    'field1':{
        'buckets':[
            {
                'key':'value1',
                'field2':{
                    'buckets':[
                        {
                            'key':'1.1.1.1',
                            'doc_count':15
                        },
                        {
                            'key': '2.2.2.2',
                            'doc_count': 12
                        }

                    ]

                }
            },
            {
                'key': 'value2',
                'field2': {
                    'buckets': [
                        {
                            'key': '3.3.3.3',
                            'doc_count': 15
                        },
                        {
                            'key': '4.4.4.4',
                            'doc_count': 12
                        }
                     ]
                 }

            },
            {
                'key': 'value3',
                'field2': {
                    'buckets': [
                        {
                            'key': '5.5.5.5',
                            'doc_count': 15
                        },
                        {
                            'key': '6.6.6.6',
                            'doc_count': 12
                        }
                     ]
                 }
            }
        ]
    }
}

我希望结果是这样的:

[{'field1':'value1', 'field2':'1.1.1.1'}, 
 {'field1':'value1', 'field2':'2.2.2.2'},
 {'field1':'value2', 'field2':'3.3.3.3'},
 {'field1':'value2', 'field2':'4.4.4.4'},
 {'field1':'value3', 'field2':'5.5.5.5'},
 {'field1':'value3', 'field2':'6.6.6.6'} ]

类似于包含行和列的普通数据库。聚合名称必须是必要的列名。我曾想过使用数据的一些树表示,然后在用dfs创建树数据结构之后创建结果的每一行。但需要一个地方开始。

1 个答案:

答案 0 :(得分:0)

如果将JSON聚合结果加载到字典(json.loads('{...}'))中,则可以在3行代码中非常简单地迭代它:

fields = []
for bucket in agg['aggregations']['field1']['buckets']:
    for sub in bucket['field2']['buckets']:
        fields.append({'field1': bucket['key'], 'field2': sub['key']})

运行此操作后,field数组将完全包含您所需的内容,即(使用json.dumps(fields)获取下面的JSON)

[
  {
    "field2": "1.1.1.1",
    "field1": "value1"
  },
  {
    "field2": "2.2.2.2",
    "field1": "value1"
  },
  {
    "field2": "3.3.3.3",
    "field1": "value2"
  },
  {
    "field2": "4.4.4.4",
    "field1": "value2"
  },
  {
    "field2": "5.5.5.5",
    "field1": "value3"
  },
  {
    "field2": "6.6.6.6",
    "field1": "value3"
  }
]