Проблема с датой агрегирования гистрограммы с фильтром - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь получить гистограмму даты для поля метки времени для определенного периода c. Я использую следующий запрос,

{
  "aggs" : {
    "dataRange" : {
      "filter": {"range" : {  "@timestamp" :{ "gte":"2020-02-28T17:20:10Z","lte":"2020-03-01T18:00:00Z" } } },
       "aggs" : {
        "severity_over_time" :{
            "date_histogram" : { "field" : "@timestamp", "interval" : "28m" }
        }}}
  },"size" :0
}

Следующий результат, который я получил,

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 32,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "dataRange": {
      "doc_count": 20,
      "severity_over_time": {
        "buckets": [
          {
            "key_as_string": "2020-02-28T17:04:00.000Z",
            "key": 1582909440000,
            "doc_count": 20
          }
        ]
      }
    }
  }
}

Начало диапазона гистограммы ("key_as_string") выходит за пределы моих критериев фильтрации! Мой входной фильтр от "2020-02-28T17: 20: 10Z", но key_as_string в результате "2020-02-28T17: 04: 00.000Z", который находится вне фильтра диапазона!

Я пытался просматривать документы, но безрезультатно. Я что-то здесь упускаю?

1 Ответ

1 голос
/ 02 марта 2020

Я думаю, это связано со способом вычисления Range или bucket. Насколько я понимаю, 28m диапазона должны быть сохранены на всем протяжении, то есть размер ковша должен быть постоянным.

Обратите внимание, что 28m разницы в диапазонах поддерживается идеально и таким образом, что первое и последнее сегменты кажутся растянутыми только для того, чтобы приспособиться к этому диапазону 28m.

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

По сути ES не гарантирует, что созданные range values i.e. key_as_string или start and end values of buckets могут точно попасть * в область действия предоставленного вами фильтра, но гарантируют, что только документы , отфильтрованные согласно этому фильтрующему запросу, будут рассматриваться для оценки.

Можно сказать, что значения сегмента являются ближайшими возможными значениями или приближениями.

Если вы хотите быть уверены в отфильтрованных документах, просто удалите фильтр из агрегирования и используйте его в запросе, как показано ниже, и удалите size: 0

Обратите внимание, что я использовал смещение , которое изменит начальное значение указанного сегмента. Возможно, это то, что вы ищете.

Еще одна вещь, я использовал min_doc_count, чтобы вы могли отфильтровывать пустые корзины.

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "2020-02-28T17:20:10Z",
              "lte": "2020-03-01T18:00:01Z"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "severity_over_time": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "28m",
        "offset": "+11h",
        "min_doc_count": 1
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...