我有一个类似于以下的原始聚合脚本,但是很难将其转换为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()...
最终,我明白了。我更改了一些订单,结果与预期的一样。这将在同一层汇总“ id”,“ date”和“ sum _ {} _ gap”,并在“ date”下汇总其他指标和管道。