我有这个创建 3 个嵌套存储桶的查询:
POST /videos/_search
{
"aggs":{
"filtered_videos":{
"filter":{
"terms":{
"videoId.keyword":[
"randomId1",
"randomId2",
"randomId3",
500 more...
]
}
},
"aggs":{
"filtered_usernames":{
"filter":{
"terms":{
"username.keyword":[
"userExample1",
"userExample2",
"userExample3",
500 more...
]
}
},
"aggs":{
"success_actions":{
"filter":{
"term":{
"success":true
}
},
"aggs":{
"usernames":{
"terms":{
"field":"username.keyword",
"size":10000
},
"aggs":{
"videos":{
"terms":{
"field":"videoId.keyword",
"size":10000,
"missing":"random"
},
"aggs":{
"actions":{
"terms":{
"field":"actionType.keyword",
"size":10000
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将创建 3 个嵌套的存储桶、用户名、每个用户名的视频以及每个用户名的每个视频的操作,这正是我想要的。
问题是似乎弹性搜索的默认限制是 10000 个存储桶。但是对于我的用例,我需要 500 个用户名存储桶,每个存储桶有 500 个视频存储桶,每个存储桶有 20 个操作存储桶。所以 500 * 500 * 20 或 500 万个桶。我知道我可以提高限制,这不是我的问题。
我的问题是:
elasticsearch是否将每个子存储桶计为一个存储桶,这意味着我必须将限制提高到500万,还是有其他计算方法?
是的。每个“根”存储桶包含 500 个存储桶,而这 500 个存储桶中的每一个又包含 20 个存储桶,依此类推。所以,是的,500*500*20。但是你的查询有 6 个级别的聚合......
如果我将限制提高到 500 万,elasticsearch 是否能够处理这样的查询,或者会崩溃吗?
这是一个很大的数字,ES 能否处理这个问题还很难说。这涉及许多变量(节点数量、它们的资源情况、它们正在处理的负载、内存使用情况、CPU 使用情况等),只有测试才能回答这个问题。例如,查询可能有时成功运行,有时失败(如果集群负载较多)。
如何优化查询以使用更少的存储桶获取相同的数据?
首先,为什么一次性需要那么多?这是人类不可能完成的结果数量。尝试使用composite聚合并对结果进行“分页”。
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |