0

我有两个字段子聚合:`['field1', 'field2']。这两个字段都是术语聚合。对于所有这些桶和嵌套以及桶嵌套,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 创建树数据结构后创建结果的每一行。但需要一个地方开始。

4

1 回答 1

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 已通过 获取json.dumps(fields)

[
  {
    "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"
  }
]
于 2016-11-23T12:11:48.173 回答