Агрегация Bucket_selector и размер. оптимизации - PullRequest
2 голосов
/ 17 октября 2019

У меня есть вопрос об агрегации bucket_selector. (Протестированная среда: ES6.8 и ES7 basic на centos7)

В моем случае использования мне нужно отбросить документы, если есть ошибки в выбранном свойстве. Индекс не большой, около 2 млн записей. Запрос на поиск этих записей выглядит следующим образом:

GET index_id1/_search
{
  "size": 0,
  "aggs": {
    "byNested": {
      "nested": {
        "path": "nestedObjects"
      },
      "aggs": {
        "sameIds": {
          "terms": {
            "script": {
              "lang": "painless",
              "source": "return doc['nestedObjects.id'].value"
            },
            "size": 1000
          },
          "aggs": {
            "byId": {
              "reverse_nested": {}
            },
            "byId_bucket_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "totalCount": "byId._count"
                },
                "script": {
                  "source": "params.totalCount > 1"
                }
              }
            }
          }
        }
      }
    }
  }
}

Я получаю ведра обратно. Но чтобы расслабить запрос и нагрузку. Я делаю это размером : 1000 . Итак, следующий запрос выдан, чтобы получить больше дупликов, пока не вернется ноль. Проблема, однако, - слишком небольшое количество обманщиков. Я проверил результат запроса, установив size: 2000000 :

GET index_id1/_search
{
  "size": 0,
  "aggs": {
    "byNested": {
      "nested": {
        "path": "nestedObjects"
      },
      "aggs": {
        "sameIds": {
          "terms": {
            "script": {
              "lang": "painless",
              "source": "return doc['nestedObjects.id'].value"
            },
            "size": 2000000  <-- too big
          },
          "aggs": {
            "byId": {
              "reverse_nested": {}
            },
            "byId_bucket_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "totalCount": "byId._count"
                },
                "script": {
                  "source": "params.totalCount > 1"
                }
              }
            }
          }
        }
      }
    }
  }
}

Как я понимаю, первый шаг: он фактически создает сегменты, как указано в запросе, а затем фильтрует только bucket_selector. Что мне нужно. И именно поэтому я вижу такое поведение. Чтобы получить все сегменты, мне нужно настроить "search.max_buckets" на 2000000 .

Преобразовать в запрос с составной агрегацией:

GET index_id1/_search
{
  "aggs": {
    "byNested": {
      "nested": {
        "path": "nestedObjects"
      },
      "aggs": {
        "compositeAgg": {
          "composite": {
            "after": {
              "termsAgg": "03f10a7d-0162-4409-8647-c643274d6727"
            },
            "size": 1000,
            "sources": [
              {
                "termsAgg": {
                  "terms": {
                    "script": {
                      "lang": "painless",
                      "source": "return doc['nestedObjects.id'].value"
                    }
                  }
                }
              }
            ]
          },
          "aggs": {
            "byId": {
              "reverse_nested": {}
            },
            "byId_bucket_filter": {
              "bucket_selector": {
                "script": {
                  "source": "params.totalCount > 1"
                },
                "buckets_path": {
                  "totalCount": "byId._count"
                }
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

Как я понимаюон делает то же самое, за исключением того, что мне нужно сделать 2000 вызовов ( размер: 1000 каждый), чтобы просмотреть весь индекс. Композитный агг кэширует результаты или почему это лучше? Может быть, есть лучший подход в этом случае?

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