jrj*_*rjd 9 elasticsearch elasticsearch-aggregation
我正在使用Elasticsearch 2.3,我正在尝试使用管道聚合执行两步计算.我只对管道聚合的最终结果感兴趣,但Elasticsearch返回所有桶信息.
由于我有大量的桶(数十或数亿),这是令人望而却步的.不幸的是,我找不到告诉Es不要返回所有这些信息的方法.
这是一个玩具的例子.我有test-index一个文档类型的索引obj.obj有两个字段,key和values.
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"
}'
Run Code Online (Sandbox Code Playgroud)
我想得到具有相同s 的s key的最小值的平均值(在所有s上).平均最小值.valueobjkey
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"
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
但是这个查询返回每个桶的最小值,虽然我不需要它:
{
"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
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱里面的所有信息"buckets": [...]?我只对...感兴趣avg_min_value.
这可能不是这个玩具示例中的问题,但是当不同keys 的数量不大(数十或数亿)时,查询响应非常大,我想修剪它.
有没有办法用Elasticsearch做到这一点?或者我建模我的数据错了?
注意:每个密钥预先聚合我的数据是不可接受的,因为match_all我的查询部分可能被复杂和未知的过滤器所取代.
NB2:size在我的terms聚合中更改为非负数是不可接受的,因为它会改变结果.
小智 14
我有同样的问题,经过相当多的研究,我找到了一个解决方案,并认为我会在这里分享.
您可以使用" 响应过滤"功能过滤要接收的答案部分.
通过将查询参数添加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"
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
PS:如果你发现另一种解决方案,你介意在这里分享吗?谢谢!
| 归档时间: |
|
| 查看次数: |
2927 次 |
| 最近记录: |