asticsearch «Попытка создать слишком много ведер» с вложенными скоплениями ведер - PullRequest
7 голосов
/ 13 января 2020

У меня есть этот запрос, который создает 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
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Это создает 3 вложенных сегмента, имена пользователей, видео каждого имени пользователя и действия каждого видео каждого имени пользователя, что является именно тем, что я хочу .

Проблема в том, что, по-видимому, по умолчанию предел эластичного поиска составляет 10000 сегментов. Однако для моего случая использования мне нужно 500 блоков имени пользователя, каждый из которых имеет 500 блоков видео, каждый из которых содержит 20 блоков действий. Итак, 500 * 500 * 20 или 5 миллионов ведер. Я знаю, что могу поднять предел, это не мой вопрос.

Мои вопросы:

  • Считает лиasticsearch каждое дочернее ведро как ведро, что означает, что я должен был бы поднять лимит до 5 миллионов, или есть другой способ расчета?
  • Будет лиasticsearch справиться с таким запросом или он достигнет sh, если я увеличу лимит до 5 миллионов?
  • Как я могу оптимизировать свой запрос, чтобы получить те же данные с меньшим количеством сегментов?

1 Ответ

4 голосов
/ 17 января 2020

Считает лиasticsearch каждое дочернее ведро как ведро, что означает, что я должен был бы поднять предел до 5 миллионов, или есть другой способ его расчета?

Да. Каждое ведро "root" содержит 500 ведер, и каждое из этих 500 содержит 20 и так далее. Итак, да, 500 * 500 * 20. Но у вашего запроса есть 6 уровней агрегации ...

Сможет лиasticsearch обработать такой запрос или он достигнет sh, если я увеличу лимит до 5 миллионов?

Это большое число, и если ES справится с этим или нет, сказать совершенно невозможно. В этом участвует много переменных (количество узлов, насколько они обеспечены ресурсами, какая нагрузка они обрабатывают, использование памяти, использование процессора и т. Д. c и c), и только тесты могут ответить на вопрос. Например, возможно, что запрос будет успешно выполнен несколько раз, а в другой раз (если кластер более загружен), например.

Как я могу оптимизировать свой запрос, чтобы получить те же данные с меньшим количеством сегментов ?

Прежде всего, зачем вам столько в одном go? Это по-человечески невозможное количество результатов до go до конца. Попробуйте использовать composite агрегацию и «разбивать» результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...