我有两个字段子聚合:`[' 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创建树数据结构之后创建结果的每一行。但需要一个地方开始。
答案 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"
}
]