Как выполнить агрегацию конвейера, не возвращая все сегменты в Elasticsearch

Я использую Elasticsearch 2.3 и пытаюсь выполнить двухэтапное вычисление с использованием агрегации конвейеров. Меня интересует только конечный результат агрегации моего конвейера, но Elasticsearch возвращает всю информацию о контейнерах.

Поскольку у меня огромное количество ведер (десятки или сотни миллионов), это непозволительно. К сожалению, я не могу найти способ сказать Es не возвращать всю эту информацию.

Вот игрушечный пример. У меня есть индексtest-index с типом документаobj. obj имеет два поля,key а такжеvalues.

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 100,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 20,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 50,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 60,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 70,
  "key": "bar"
}'

Я хочу получить среднее значение (по всемkeys) из минимумаvalue изobjс тем жеkeys. Среднее из минимумов.

Elasticsearch позволяет мне сделать это:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggregations": {
    "key_aggregates": {
      "terms": {
        "field": "key",
        "size": 0
      },
      "aggs": {
        "min_value": {
          "min": {
            "field": "value"
          }
        }
      }
    },
    "avg_min_value": {
      "avg_bucket": {
        "buckets_path": "key_aggregates>min_value"
      }
    }
  }
}'

Но этот запрос возвращает минимум для каждого сегмента, хотя он мне и не нужен:

{
  "took": 21,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": [

    ]
  },
  "aggregations": {
    "key_aggregates": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "bar",
          "doc_count": 2,
          "min_value": {
            "value": 50
          }
        },
        {
          "key": "foo",
          "doc_count": 2,
          "min_value": {
            "value": 20
          }
        }
      ]
    },
    "avg_min_value": {
      "value": 35
    }
  }
}

Есть ли способ избавиться от всей информации внутри"buckets": [...]? Меня интересует толькоavg_min_value.

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

Есть ли способ сделать это с Elasticsearch? Или я неправильно моделирую свои данные?

Примечание: не допускается предварительная агрегация моих данных по ключу, посколькуmatch_all часть моего запроса может быть заменена сложными и неизвестными фильтрами.

NB2: меняетсяsize на неотрицательное число в моемterms агрегация неприемлема, потому что это может изменить результат.

Ответы на вопрос(1)

Ваш ответ на вопрос