Я хочу получить date_histogram за определенный период, как ограничить период даты? как мне использовать параметр Extended_bounds? Например: я хочу запросить гистограмму date_histogram между «2024-07-10» и «2024-07-22», и фиксированный_интервал может быть изменен. Я запрашиваю это выражение, гарантируя, что в запросе будет тот же диапазон фильтров:
GET /logging-events/_search
{
"size": 1,
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"gt": "2024-07-10T00:00:00",
"lt": "2024-07-22T23:59:59"
}
}
}
]
}
},
"aggregations": {
"date_ranges": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "8d",
"extended_bounds": {
"min": "2024-07-10",
"max": "2024-07-22"
},
"format":"yyyy-MM-dd"
}
}
}
}
Но я все равно получаю date_histogram вне диапазона.
Неожиданный ответ:
aggregations.date_ranges.buckets[0].key_as_string eq 8 июля 2024 г.
{
"hits": {
"total": {
"value": 13,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "logging-events",
"_id": "BuP86ZAB2uzWuz8xZdkz",
"_score": 0.0,
"_source": {
"_class": "com.ecommerce.monitoring.services.event.LoggingEvent",
"event_type": "CLICK",
"session_id": "b2f4d3a1-4d4e-4f67-9b2a-0e7b0c9b5e2f",
"product_id": 22,
"shop_id": 2,
"timestamp": "2024-07-10T06:15:42.000Z"
}
}
]
},
"aggregations": {
"date_ranges": {
"buckets": [
{
"key_as_string": "2024-07-08",
"key": 1720396800000,
"doc_count": 6
},
{
"key_as_string": "2024-07-16",
"key": 1721088000000,
"doc_count": 7
}
]
}
}
}
Ожидается: начинается с 10 июля 2024 г.
@imotov Спасибо, что обратились. 1- Сообщение отредактировано. Я прикрепил ответ, полученный в результате звонка. 2- временная метка с типом даты в формате date_optional_time||epoch_millis. 3- Нет, только одна временная метка.
Прежде всего, я думаю, что следующее предложение в документации Elasticsearch не отражает того, что на самом деле происходит, и могло вас смутить.
С настройкой
extended_bounds
теперь вы можете «форсировать» гистограмму. агрегирование, чтобы начать создавать сегменты по определенному минимальному значению, а также продолжайте создавать сегменты до максимального значения (даже если нет документов больше нет).
Вы не можете принудительно создавать сегменты по определенному значению, вы можете принудительно создавать пустые сегменты только до и после вашего последнего доступного документа, но сегмент начнется со значений, указанных в fixed_interval
, независимо от того, что вы укажете в extended_bounds
. Итак, если фиксированный интервал равен 8d
, сегменты будут создаваться только каждые 8 дней, начиная с 1 января 1970 года.
08.07.2024 — это 19 912-й день после 1 января 1970 г., а число 19 912 делится на 8, поэтому сегмент начинается в эту дату, а не 10 июля 2024 г. Чтобы переместить сегмент на 10 июля 2024 г., вам нужно добавить 2d
смещение к гистограмме даты. Итак, в вашем случае запрос должен выглядеть так:
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"range": {
"timestamp": {
"gt": "2024-07-10T00:00:00",
"lt": "2024-07-22T23:59:59"
}
}
}
]
}
},
"aggregations": {
"date_ranges": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "8d",
"format":"yyyy-MM-dd",
"offset": "2d"
}
}
}
}
Возможно, вы также захотите использовать hard_bounds
вместо запроса, чтобы ограничить создаваемые сегменты.
Мне нужна была информация о начальном количестве сегментов, потому что у меня есть требование, чтобы фиксированный интервал динамически настраивался с сервера. Без информации о дате начала я боролся с тем, как справиться со смещением. Возможно, официальная документация также должна включать это. Я очень ценю вашу помощь.
1) Можете ли вы уточнить, что вы подразумеваете под «Я все еще получаю date_histogram вне диапазона»? Возможно, вам поможет пример того, что вы получаете, и того, что вы ожидаете? 2) Каково ваше сопоставление метки времени? 3) Могут ли ваши записи содержать несколько меток времени для каждой записи?