Агрегация конвейера с гистограммой даты не возвращает ожидаемый результат

Я столкнулся с проблемой использования агрегации конвейера с гистограммой даты. Мне нужно отфильтровать данные от: «2019-03-08T06:00:00Z» до «2019-03-09T10:00:00Z» и выполнить агрегацию гистограммы. Затем рассчитайте среднее значение после агрегирования по кардинальности agg.

{
  "size": 0,
  "query": {
        "bool" : {
            "filter": {
                "range" : {
                    "recordTime" : {
                        "gte" : "2019-03-08T06:00:00Z",
                        "lte" : "2019-03-09T10:00:00Z"
                    }
                }
            }
        }
    }, 
    "aggs" : {
        "events_per_bucket" : {
            "date_histogram" : {
                "field" : "eventTime",
                "interval" : "1h"
            },
            "aggs": {
                "cards_per_bucket": {
                    "cardinality": {
                        "field": "KANBAN_PKKEY.keyword"
                    }
                }
            }
        },
        "avg_cards_per_bucket": {
            "avg_bucket": {
                "buckets_path": "events_per_bucket>cards_per_bucket.value"
            }
        }
    }
}

Результат:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "events_per_bucket": {
            "buckets": [
                {
                    "key_as_string": "2019-03-08T06:00:00.000Z",
                    "key": 1552024800000,
                    "doc_count": 1,
                    "cards_per_bucket": {
                        **"value": 1**
                    }
                },
                {
                    "key_as_string": "2019-03-08T07:00:00.000Z",
                    "key": 1552028400000,
                    "doc_count": 0,
                    "cards_per_bucket": {
                        **"value": 0**
                    }
                },
                {
                    "key_as_string": "2019-03-08T08:00:00.000Z",
                    "key": 1552032000000,
                    "doc_count": 1,
                    "cards_per_bucket": {
                        **"value": 1**
                    }
                }
            ]
        },
        "avg_cards_per_bucket": {
            **"value": 1**
        }
    }
}

Проблема в том, почему среднее значение равно "1"? Должно быть: 2/3 = 0,6666. Почему ведро кардинальности с нулевым значением игнорируется? Если я удалю кардинальность agg и сделаю avg для doc_count (events_per_bucket>_count), тогда все будет нормально. То же самое происходит и с MAX, MIN, SUM. Любая помощь будет оценена по достоинству! Спасибо.


person Tricky Giang    schedule 10.03.2019    source источник


Ответы (1)


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

...
  "avg_cards_per_bucket": {
    "avg_bucket": {
      "buckets_path": "events_per_bucket>cards_per_bucket.value",
      "gap_policy": "insert_zeros"
    }
  }
...

Дополнительные сведения см. в документации Elastic. .

person glenacota    schedule 10.03.2019
comment
Он работает с gap_policy. Значение 0 подcards_per_bucket меня сильно смущает, и я только что понял, что пустые корзины не обрабатываются суб-аггами. Я копал целые страницы документов ES, и пришло ваше решение. Спасибо @Glenacota за вашу быструю помощь! - person Tricky Giang; 10.03.2019