Запрос elasticsearch с несколькими числовыми диапазонами

#elasticsearch

#elasticsearch

Вопрос:

 {
  "query": {
    "filtered": {
      "query": {
        "match": {
          "log_path": "message_notification.log"
        }
      },
      "filter": {
        "numeric_range": {
          "time_taken": {
            "gte": 10
          }
        }
      }
    }
  },
  "aggs": {
    "distinct_user_ids": {
      "cardinality": {
        "field": "user_id"
      }
    }
  }
}
  

Я должен выполнить этот запрос 20 раз, так как я хочу знать время уведомления выше каждого из следующих пороговых значений- [10,30,60,120,240,300,600,1200..] . Прямо сейчас я запускаю цикл и делаю 20 запросов для получения этого.

Есть ли более разумный способ запросить elasticsearch один раз и получить диапазоны, которые попадают в эти пороговые значения соответственно?

Ответ №1:

Вероятно, вам нужна «агрегация диапазонов«.

Вот возможный запрос, в котором вы можете добавить больше диапазонов или изменить их —

{
"size": 0,
"query": {
"match": {
"log_path": "message_notification.log"
}
},
"aggs": {
"intervals": {
"range": {
"field": "time_taken",
"ranges": [
{
"to": 50
},
{
"from": 50,
"to": 100
},
{
"from": 100
}
]
},
"aggs": {
"distinct_user_ids": {
"cardinality": {
"field": "user_id"
}
}
}
}
}
}