Elasticsearch Запрос, чтобы показать результаты значений полей, которые появляются в двух диапазонах дат? - PullRequest
0 голосов
/ 17 января 2019

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

В целях отслеживания я хочу специально отслеживать события, которые произошли неделю или месяц назад, а также отслеживать, происходили ли эти события ТАКЖЕ на предыдущей неделе или в предыдущем месяце до этого месяца.

Например, сейчас «сейчас», я хочу получить документы, имена которых отображаются в обоих:

{
    range: { "last_seen" : { "gte" : "now-1w/d", "lte" : "now" } }
}

и

{
    range: { "last_seen" : { "gte" : "now-2w/d", "lte" : "now-1w/d" } }
}

Таким образом, если документ с именем «посетитель» появляется в обоих диапазонах, он считается. Если документ с именем «shutdown» появляется только в одном диапазоне, он не учитывается.

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

{
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "_type": "events"
                    }
                }
            ],
            "must": {
                "range": {
                    "last_seen": {
                        "gte": "now-2w/d"
                    }
                }
            }
        }
    },
    "size":0,
    "aggregations": {
        "per_day_events": {
            "date_histogram": {
                "field" : "last_seen",
                "interval" : "day",
                "format" : "date",
                "time_zone" : "America/New_York"
            },
            "aggregations" : {
                "daily_events": {
                    "date_range" : {
                        "field": "last_seen",
                        "format": "date",
                        "ranges": [
                            { "from" : "now-1w/d" }
                        ]
                    },
                    "aggregations" : {
                        "unique_events": {
                            "cardinality": {
                                "field": "name.keyword"
                            }
                        }
                    }
                }
            }
        }
    }
}

name - это текстовое поле, а последним - поле даты.

Возможно ли то, что я хочу сделать в одном запросе Elasticsearch?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...