elasticsearch 哪种方法是获得聚合所有结果的最有效方法
我有以下疑问:
elasticsearch 哪种方法是获得聚合所有结果的最有效方法,
elasticsearch,
elasticsearch,我有以下疑问: GET my-index-*/my-type/_search { "size": 0, "aggregations": { "my_agg": { "terms": { "script" : "code" }, "aggs": { "dates": { "date_range": { "field": "created_time",
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\u filter
会根据总计数对它们进行过滤,而我只得到其中的一些。我需要得到所有结果,这意味着我需要指定“size”=n
,其中n
是code
值的不同计数,这样我就不会丢失任何数据。我有数十亿个文档,所以在我的例子中,n
大约是30000个。当我尝试执行查询时,集群上出现了“内存不足”,所以我想这不是最好的办法。有没有一种好方法可以获取我的查询的所有结果?不幸的是,对于具有30K唯一值的高真实性字段,不建议这样做。原因是因为内存成本和需要从碎片中收集的大量数据。它可能会工作,但你需要更多的内存
更有效的解决方案是使用滚动API
,在搜索请求中的字段中指定要从字段中检索的值,然后将这些值存储在客户端内存中或流式处理
更新:自ES 6.5以来,这在复合聚合中已成为可能,请参阅