elasticsearch“试图创建太多的桶”与嵌套的桶聚合

use*_*234 7 elasticsearch

我有这个创建 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 万,elasticsearch 能够处理这样的查询还是会崩溃?
  • 如何优化我的查询以使用更少的存储桶获得相同的数据?

And*_*fan 4

elasticsearch是否将每个子存储桶计为一个存储桶,这意味着我必须将限制提高到500万,还是有其他计算方法?

是的。每个“根”存储桶包含 500 个存储桶,而这 500 个存储桶中的每一个又包含 20 个存储桶,依此类推。所以,是的,500*500*20。但是你的查询有 6 个级别的聚合......

如果我将限制提高到 500 万,elasticsearch 是否能够处理这样的查询,或者会崩溃吗?

这是一个很大的数字,ES 能否处理这个问题还很难说。这涉及许多变量(节点数量、它们的资源情况、它们正在处理的负载、内存使用情况、CPU 使用情况等),只有测试才能回答这个问题。例如,查询可能有时成功运行,有时失败(如果集群负载较多)。

如何优化查询以使用更少的存储桶获取相同的数据?

首先,为什么一次性需要那么多?这是人类不可能完成的结果数量。尝试使用composite聚合并对结果进行“分页”。