Как определить общее количество значений после агрегации данных?

Как получить общее количество страниц значений для первого запроса при использовании composite aggs с пагинацией?
  • 17 октября 2023 г. 13:01
Ответы на вопрос 3
Для определения общего количества значений после агрегации данных можно использовать агрегацию `cardinality`, которая подсчитывает количество уникальных значений в поле.

Пример использования агрегации `cardinality` в Elasticsearch:
```
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "unique_count": {
      "cardinality": {
        "field": "my_field"
      }
    }
  }
}
```
Здесь мы указываем `cardinality` внутри агрегации и указываем поле `my_field`, для которого мы хотим посчитать количество уникальных значений. Результат будет содержать поле `value`, в котором будет указано общее количество уникальных значений в поле.

Чтобы получить общее количество страниц значений для первого запроса при использовании composite aggs с пагинацией, вам необходимо узнать общее количество уникальных значений в соответствующем поле и разделить его на размер страницы.

Допустим, у нас есть агрегация `composite` с пагинацией, которая выглядит примерно так:
```
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "my_aggregation": {
      "composite": {
        "sources": [
          {
            "my_field": {
              "terms": {
                "field": "my_field"
              }
            }
          }
        ],
        "size": 10
      }
    }
  }
}
```
Здесь мы указываем `composite` внутри агрегации и устанавливаем `size` равным 10, чтобы получить 10 результатов на странице.

Чтобы получить общее количество страниц значений для первого запроса, мы можем добавить агрегацию `cardinality`, как показано выше, чтобы узнать общее количество уникальных значений в поле `my_field`. Затем мы можем разделить это значение на размер страницы (`size`) и округлить результат до ближайшего целого значения.

Вот как может выглядеть общий запрос для получения общего количества страниц значений при использовании composite aggs с пагинацией:
```
GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "total_count": {
      "cardinality": {
        "field": "my_field"
      }
    },
    "page_count": {
      "bucket_script": {
        "buckets_path": {
          "totalCount": "total_count.value"
        },
        "script": "Math.ceil(params.totalCount / params.size)",
        "params": {
          "size": 10
        }
      }
    }
  }
}
```
Здесь мы добавили агрегацию `total_count`, чтобы получить общее количество уникальных значений в поле `my_field`. Затем мы добавили агрегацию `page_count`, которая использует `bucket_script` для выполнения вычисления и получения общего количества страниц значений. Значение размера (`size`) задается в параметрах скрипта для разделения общего количества на размер страницы.

Результат запроса будет содержать поле `value` в агрегации `page_count`, которое будет указывать общее количество страниц значений для первого запроса при использовании composite aggs с пагинацией.
{"aggregations": {"total_websites": {"unique_count": {"field" : "website.keyword"}}}} 
 {"aggregations": {"total_websites": {"unique count of websites": {"using the field 'website.keyword' for counting"}}}}
Похожие вопросы