Я храню документы, связанные с событиями, которые происходят ежедневно. У них есть поле имени, которое обозначает событие.
В целях отслеживания я хочу специально отслеживать события, которые произошли неделю или месяц назад, а также отслеживать, происходили ли эти события ТАКЖЕ на предыдущей неделе или в предыдущем месяце до этого месяца.
Например, сейчас «сейчас», я хочу получить документы, имена которых отображаются в обоих:
{
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?