Средняя совокупность сегментов, включая 0 значений - PullRequest
0 голосов
/ 04 декабря 2018

Я использую ES для получения статистики в день в случае, когда у меня нет входных данных на каждый день, но где отсутствующие данные также являются информацией как таковой (в моем случае я измеряю активность).Для решения этой задачи я использую среднее агрегирование сегментов и устанавливаю min_doc_count равным 0, чтобы иметь значение, даже если мои данные отсутствуют.Мой запрос выглядит следующим образом:

query = {
 "size": 0,
   "query": {
        "bool" : {
            "should" :{
                "match" : { "LogEntryType" : "LogEntry" }    
            },
            "must" : {
                'match' : {'Id' : id}
            }
        }

    },
  "aggs": {
    "actions_per_day": {
      "date_histogram": {
        "field": "CreationTime",
        "interval": "day",
          "min_doc_count" : 0
      },
      "aggs": {
        "amount": {
          "value_count": {
            "field": "CreationTime"
          }
        }
      }
    },
    "avg_daily_action": {
      "avg_bucket": {
        "buckets_path": "actions_per_day>amount"
      }
    }
  }
 }
 es1.search(index=indx1, body=query)

И он возвращает объекты со значением, установленным в 0, как вы можете видеть в следующем фрагменте ответа:

{'took': 1,
'timed_out': False,
'_shards': {'total': 2, 'successful': 2, 'failed': 0},
'hits': {'total': 4321, 'max_score': 0.0, 'hits': []},
'aggregations': {'actions_per_day': {'buckets': [
{'key_as_string': '2018-07-13T00:00:00.000Z',
 'key': 1531440000000,
 'doc_count': 631,
 'amount': {'value': 631}},
{'key_as_string': '2018-07-14T00:00:00.000Z',
 'key': 1531526400000,
 'doc_count': 0,
 'amount': {'value': 0}}...

Но мойпроблема заключается в том, что для среднесуточного действия вычисление не учитывает значения 0, а возвращает:

...'avg_daily_action': {'value': 432.1}

, что соответствует среднему значению, не учитывающему те дни, когда не было введено никаких данных.Я обнаружил эту проблему , где упоминается, что мне следует использовать параметр «пропущенный», однако я считаю, что он предназначен для извлечения элементов с 0, и у меня уже есть они.Любые подсказки о том, как их принять во внимание?

1 Ответ

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

Оказывается, я почти был там.Необходимо использовать параметр gap_policy в агрегации среднего сегмента, чтобы учесть 0 значений.Средняя часть сегмента теперь становится

 "avg_daily_operations": {
      "avg_bucket": {
        "buckets_path": "modifications_per_day>amount",
          "gap_policy" : "insert_zeros"
      }
 }

. По умолчанию установлено значение skip , и его изменение решает проблему.

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