将子聚集合并/展平到主聚集

vq8itlhq  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(292)

elasticsearch中是否存在以某种扁平形式(多个子/子聚合)返回结果的方法?
例如,目前我正在尝试获取所有产品类型及其状态(在线/离线)。
这就是我的结局:aggs

[
{ key: SuperProduct, doc_count:3, subagg:[
                                         {status:online, doc_count:1},
                                         {status:offline, doc_count:2}
                                         ]
},
{ key: SuperProduct2, doc_count:10, subagg:[
                                         {status:online, doc_count:7},
                                         {status:offline, doc_count:3}
                                         ]

图表库倾向于将其扁平化,因此我想知道elasticsearch是否可以以这种方式进行探索:

[
  { products_key: 'SuperProduct', status_key:'online', doc_count:1},
  { products_key: 'SuperProduct', status_key:'offline', doc_count:2},
  { products_key: 'SuperProduct2', status_key:'online', doc_count:7},
  { products_key: 'SuperProduct2', status_key:'offline', doc_count:3}
]

谢谢

ukqbszuj

ukqbszuj1#

可以使用复合聚合来链接两个术语聚合:

// POST /i/_search

{
    "size": 0,
    "aggregations": {
        "distribution": {
            "composite": {
                "sources": [
                    {"product": {"terms": {"field": "product.keyword"}}},
                    {"status": {"terms": {"field": "status.keyword"}}}
                ]
            }
        }
    }
}

这将导致以下结构:

{
    "aggregations": {
        "distribution": {
            "after_key": {
                "product": "B",
                "status": "online"
            },
            "buckets": [
                {
                    "key": {
                        "product": "A",
                        "status": "offline"
                    },
                    "doc_count": 3
                },
                {
                    "key": {
                        "product": "A",
                        "status": "online"
                    },
                    "doc_count": 2
                },
                {
                    "key": {
                        "product": "B",
                        "status": "offline"
                    },
                    "doc_count": 1
                },
                {
                    "key": {
                        "product": "B",
                        "status": "online"
                    },
                    "doc_count": 4
                }
            ]
        }
    }
}

如果出于任何原因复合聚合不能满足您的需要,您可以创建(通过copy\ to或concatenation)或模拟(通过脚本化字段)唯一标识bucket的字段。在我们的项目中,我们使用了连接(部分原因是这个领域需要崩溃)。 {"bucket": "SuperProductA:online"} ,这将导致更脏的输出(您必须将该字段解码回来或使用最上面的点击来获得原始值),但仍然可以完成这项工作。

相关问题