我有以下查询:
GET my-index-*/my-type/_search
{
"size": 0,
"aggregations": {
"my_agg": {
"terms": {
"script" : "code"
},
"aggs": {
"dates": {
"date_range": {
"field": "created_time",
"ranges": [
{
"from": "2017-12-09T00:00:00.000",
"to": "2017-12-09T16:00:00.000"
},
{
"from": "2017-12-10T00:00:00.000",
"to": "2017-12-10T16:00:00.000"
}
]
}
},
"total_count": {
"sum_bucket": {
"buckets_path": "dates._count"
}
},
"bucket_filter": {
"bucket_selector": {
"buckets_path": {
"totalCount": "total_count"
},
"script": "params.totalCount == 0"
}
}
}
}
}
}
此查询的结果是一堆桶。我需要的是我的桶的钥匙列表。问题是默认情况下聚合结果大小为10,在获得那些10之后,我的bucket_filter
按总计数过滤它们,我只得到其中的一些。我需要得到所有结果,这意味着我需要指定"size" = n
,其中n
是code
值的独特计数,这样我就不会丢失任何数据。我有数十亿的文件,所以在我的情况下n
约为30.000。当我尝试执行查询时,群集上发生了“内存不足”,所以我猜这不是最好的主意。有没有一种方法可以获得我的查询的所有结果?
答案 0 :(得分:1)
不幸的是,这不建议用于具有30K唯一值的高度狂野场。原因是因为你发现了内存成本以及需要从分片中收集的大量数据。它可能有用,但是你需要更多的记忆......
更有效的解决方案是使用Scroll API
并在搜索请求中的fields
中指定要从字段中检索的值,然后将这些值存储在客户端内存中或流式传输。
更新:由于ES 6.5已经可以使用复合聚合,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html