我正在使用Elasticsearch 2.3,并且尝试使用管道聚合来执行两步计算。我只对管道聚合的最终结果感兴趣,但是Elasticsearch返回所有存储桶信息。
由于我有大量的存储桶(数以千万计),因此这是令人望而却步的。不幸的是,我找不到办法告诉Es不要返回所有这些信息。
这是一个玩具示例。我有一个test-index带有文档类型的索引obj。obj有两个字段,key和values。
test-index
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" }'
我想获得具有s 的s key的最小值的平均值(在所有s上)。平均值的最小值。value``obj``key
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。
"buckets": [...]
avg_min_value
在这个玩具示例中,这似乎不是问题,但是当不同的keys 的数量不大(数千万或数亿)时,查询响应会过大,因此我希望对此进行修剪。
有没有办法用Elasticsearch做到这一点?还是我的数据建模错误?
注意:按键预聚合我的数据是不可接受的,因为match_all我的查询部分可能被复杂且未知的过滤器所代替。
match_all
NB2:size在我的terms汇总中更改为非负数是不可接受的,因为这会更改结果。
size
terms
我遇到了同样的问题,经过大量研究,我找到了一个解决方案,并认为我会在这里分享。
您可以使用“ 响应过滤”功能来过滤要接收的部分答案。
通过将查询参数添加filter_path=aggregations.avg_min_value到搜索URL,您应该能够实现所需的目标。在示例情况下,它应类似于以下内容:
filter_path=aggregations.avg_min_value
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:如果您找到其他解决方案,您愿意在这里分享吗?谢谢!