Elasticsearch Aggregations: вернуть только результаты одного из них? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь найти способ вернуть только результаты одной агрегации в запросе Elasticsearch.У меня есть максимальное агрегирование сегмента (которое я хочу увидеть), которое рассчитывается из агрегации суммарного сегмента на основе агрегации гистограммы даты.Прямо сейчас мне нужно пройти 1440 результатов, чтобы получить тот, который я хочу увидеть.Я уже удалил результаты базового запроса с модификатором size: 0, но есть ли способ сделать что-то похожее и с агрегатами?Я попытался вставить то же самое в несколько мест без удачи.

Вот запрос:

{
    "size": 0,
    "query": {
        "range": {
            "timestamp": {
                "gte": "2018-11-28",
                "lte": "2018-11-28"
            }
        }
    },
    "aggs": {
        "hits_per_minute": {
            "date_histogram": {
                "field": "timestamp",
                "interval": "minute"
            },
            "aggs": {
                "total_hits": {
                    "sum": {
                        "field": "hits_count"
                    }
                }
            }
        },
        "max_transactions_per_minute": {
            "max_bucket": {
                "buckets_path": "hits_per_minute>total_hits"
            }
        }
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018

К счастью, вы можете сделать это с bucket_sort агрегацией , которая была добавлена ​​в Elasticsearch 6.4.

Сделайте это с bucket_sort

POST my_index/doc/_search
{
  "size": 0,
  "query": {
    "range": {
      "timestamp": {
        "gte": "2018-11-28",
        "lte": "2018-11-28"
      }
    }
  },
  "aggs": {
    "hits_per_minute": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "minute"
      },
      "aggs": {
        "total_hits": {
          "sum": {
            "field": "hits_count"
          }
        },
        "max_transactions_per_minute": {
          "bucket_sort": {
            "sort": [
              {"total_hits": {"order": "desc"}}
            ],
            "size": 1
          }
        }
      }
    }
  }
}

Это даст вам ответ, подобный следующему:

{
  ...
  "aggregations": {
    "hits_per_minute": {
      "buckets": [
        {
          "key_as_string": "2018-11-28T21:10:00.000Z",
          "key": 1543957800000,
          "doc_count": 3,
          "total_hits": {
            "value": 11
          }
        }
      ]
    }
  }
}

Обратите внимание, что в выводе нет дополнительной агрегации, а вывод hits_per_minute усекается (потому что мы попросили дать ровно один, самый верхний сегмент).

Сделайте это с помощью filter_path

Существует также универсальный способ фильтрации выходных данных Elasticsearch: Фильтрация ответов , поскольку этот ответ предполагает.

В этом случае будет достаточно просто выполнить следующий запрос:

POST my_index/doc/_search?filter_path=aggregations.max_transactions_per_minute
{ ... (original query) ... }

Это даст ответ:

{
  "aggregations": {
    "max_transactions_per_minute": {
      "value": 11,
      "keys": [
        "2018-12-04T21:10:00.000Z"
      ]
    }
  }
}

Надеюсь, это поможет!

...