何时在Elasticsearch dsl(elasticsearch-dsl-py)中使用存储桶,指标或管道?]

问题描述 投票:0回答:1

我有一个类似于以下的原始聚合脚本,但是很难将其转换为elasticsearch dsl。

我已经阅读了文档并找到描述,说我们可以使用.bucket()、. metric()和.pipeline()方法来嵌套聚合,但是缺少有关进一步说明如何使用这三种方法进行更复杂的信息聚合,就像更多层一样。

{
   "aggs": {
        "statistics": {
             "terms": {
                 "field":"id"
             },
             "aggs":{
                "date":{
                    "date_histogram":{
                        "min_doc_count":0,
                        "field":"date",
                        "interval":"1d",
                        "format":"yyyy-MM-dd"
                    },
                    "aggs":{
                        "column_a":{
                            "avg":{
                                "field":"column_a"
                            }
                        },
                        "column_b":{
                            "avg":{
                                "field":"column_b"
                            }
                        },
                        "column_c":{
                            "avg":{
                                "field":"column_c"
                            }
                        },
                        "a_gap":{
                            "serial_diff":{
                                "buckets_path":"column_a"
                            }
                        },
                        "b_gap":{
                            "serial_diff":{
                                "buckets_path":"column_b"
                            }
                        },
                        "c_gap":{
                            "serial_diff":{
                                "buckets_path":"column_c"
                            }
                        }
                    }
                },
                "sum_a_gap":{
                    "sum_bucket":{
                        "buckets_path":"date>a_gap"
                    }
                },
                "sum_b_gap":{
                    "sum_bucket":{
                        "buckets_path":"date>b_gap"
                    }
                },
                "sum_c_gap":{
                    "sum_bucket":{
                        "buckets_path":"date>c_gap"
                    }
                }
            }
        }
    }
}

这样的我的Elasticsearch-dsl查询使'sum_a_gap'与'column_a'和'a_gap'处于同一级别。

self._search.aggs
    .bucket('statistics', 'terms', field='id')
    .bucket('date', 'date_histogram', field='date',
            interval='1d', min_doc_count=0, format='yyyy-MM-dd')
    .metric('column_a', 'avg', field='column_a')
    .metric('column_b', 'avg', field='column_b')
    .metric('column_c', 'avg', field='column_c')
    .pipeline('a_gap', 'serial_diff', buckets_path='column_a')
    .pipeline('b_gap', 'serial_diff', buckets_path='column_b')
    .pipeline('c_gap', 'serial_diff', buckets_path='column_c')
    .pipeline('sum_a_gap', 'sum_bucket', buckets_path='date>a_gap')
    .pipeline('sum_b_gap', 'sum_bucket', buckets_path='date>b_gap')
    .pipeline('sum_c_gap', 'sum_bucket', buckets_path='date>c_gap')

非常感谢!

我有一个类似于以下的原始聚合脚本,但是很难将其转换为elasticsearch dsl。我已阅读该文档并找到说明,说我们可以使用.bucket()、. metric()...

python elasticsearch elasticsearch-dsl-py
1个回答
0
投票

最终,我明白了。我更改了一些订单,结果与预期的一样。这将在同一层汇总“ id”,“ date”和“ sum _ {} _ gap”,并在“ date”下汇总其他指标和管道。


推荐问答