Дата Elasticsearch в диапазоне date_histogram Extended_bounds

Я хочу получить 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 г.

1) Можете ли вы уточнить, что вы подразумеваете под «Я все еще получаю date_histogram вне диапазона»? Возможно, вам поможет пример того, что вы получаете, и того, что вы ожидаете? 2) Каково ваше сопоставление метки времени? 3) Могут ли ваши записи содержать несколько меток времени для каждой записи?

imotov 25.07.2024 16:35

@imotov Спасибо, что обратились. 1- Сообщение отредактировано. Я прикрепил ответ, полученный в результате звонка. 2- временная метка с типом даты в формате date_optional_time||epoch_millis. 3- Нет, только одна временная метка.

Adem Hassine 25.07.2024 18:37
0
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, я думаю, что следующее предложение в документации 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 вместо запроса, чтобы ограничить создаваемые сегменты.

Мне нужна была информация о начальном количестве сегментов, потому что у меня есть требование, чтобы фиксированный интервал динамически настраивался с сервера. Без информации о дате начала я боролся с тем, как справиться со смещением. Возможно, официальная документация также должна включать это. Я очень ценю вашу помощь.

Adem Hassine 26.07.2024 22:46

Другие вопросы по теме