【问题标题】:Elasticsearch data to more structured form将 Elasticsearch 数据转换为更结构化的形式
【发布时间】:2017-04-04 16:09:34
【问题描述】:

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

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 创建树数据结构后创建结果的每一行。但需要一个地方开始。

【问题讨论】:

  • 为什么不在客户端解析桶呢? 2-3 行 Python 代码即可将您的结果转换为所需的结构。
  • @Val 我说的是客户端。在我看来,这不是一个非常容易的问题。 Kibana 在前端 2 中使用与链表类似的方法并遍历存储桶和指标

标签: python elasticsearch elasticsearch-aggregation


【解决方案1】:

如果您将该 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"
  }
]

【讨论】:

  • 这个运气好吗?
  • 首先感谢您抽出宝贵时间回答。问题是(我应该说)相互嵌套的桶的数量在运行时是已知的并且是不同的。所以是的,您的方法有效,但从一开始就不知道 field1 field2 或 field3 等。所以需要想办法让客户知道“兔子洞”有多深
  • 你可以用同样的方式来做,如果事先不知道键,就迭代它们。我使用 field1、field2 等来展示这个想法,但即使您不认识它们,您也可以获取字典键并对其进行迭代。
猜你喜欢
  • 2021-10-05
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2017-01-27
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多