Я думаю, это связано со способом вычисления 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
}
}
}
}