如何在Elasticsearch中执行管道聚合而不返回所有存储桶

我正在使用Elasticsearch

2.3,并且尝试使用管道聚合来执行两步计算。我只对管道聚合的最终结果感兴趣,但是Elasticsearch返回所有存储桶信息。

由于我有大量的存储桶(数以千万计),因此这是令人望而却步的。不幸的是,我找不到办法告诉Es不要返回所有这些信息。

这是一个玩具示例。我有一个test-index带有文档类型的索引objobj有两个字段,keyvalues

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{

"value": 100,

"key": "foo"

}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{

"value": 20,

"key": "foo"

}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{

"value": 50,

"key": "bar"

}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{

"value": 60,

"key": "bar"

}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{

"value": 70,

"key": "bar"

}'

我想获得具有s 的s key的最小值的平均值(在所有s上)。平均值的最小值。value``obj``key

Elasticsearch允许我这样做:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{

"size": 0,

"query": {

"match_all": {}

},

"aggregations": {

"key_aggregates": {

"terms": {

"field": "key",

"size": 0

},

"aggs": {

"min_value": {

"min": {

"field": "value"

}

}

}

},

"avg_min_value": {

"avg_bucket": {

"buckets_path": "key_aggregates>min_value"

}

}

}

}'

但是此查询返回每个存储桶的最小值,尽管我不需要它:

{

"took": 21,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 4,

"max_score": 0,

"hits": [

]

},

"aggregations": {

"key_aggregates": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": "bar",

"doc_count": 2,

"min_value": {

"value": 50

}

},

{

"key": "foo",

"doc_count": 2,

"min_value": {

"value": 20

}

}

]

},

"avg_min_value": {

"value": 35

}

}

}

有办法摆脱里面的所有信息"buckets": [...]吗?我只对感兴趣avg_min_value

在这个玩具示例中,这似乎不是问题,但是当不同的keys 的数量不大(数千万或数亿)时,查询响应会过大,因此我希望对此进行修剪。

有没有办法用Elasticsearch做到这一点?还是我的数据建模错误?

注意:按键预聚合我的数据是不可接受的,因为match_all我的查询部分可能被复杂且未知的过滤器所代替。

NB2:size在我的terms汇总中更改为非负数是不可接受的,因为这会更改结果。

回答:

我遇到了同样的问题,经过大量研究,我找到了一个解决方案,并认为我会在这里分享。

您可以使用“

响应过滤”功能来过滤要接收的部分答案。

通过将查询参数添加filter_path=aggregations.avg_min_value到搜索URL,您应该能够实现所需的目标。在示例情况下,它应类似于以下内容:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search?filter_path=aggregations.avg_min_value' -d '{

"size": 0,

"query": {

"match_all": {}

},

"aggregations": {

"key_aggregates": {

"terms": {

"field": "key",

"size": 0

},

"aggs": {

"min_value": {

"min": {

"field": "value"

}

}

}

},

"avg_min_value": {

"avg_bucket": {

"buckets_path": "key_aggregates>min_value"

}

}

}

}'

PS:如果您找到其他解决方案,您愿意在这里分享吗?谢谢!

以上是 如何在Elasticsearch中执行管道聚合而不返回所有存储桶 的全部内容, 来源链接: utcz.com/qa/433052.html

回到顶部