Агрегация медианы / среднего количества запросов - PullRequest
1 голос
/ 28 мая 2020

У меня есть индекс с типом, который можно сократить до:

{
  'date': DATE_STRING,
  'owner': INT,
  'color: 'red' | 'purple' | 'blue'
}

, и я хочу сделать запросы для представления следующих данных, где значение владельца равно совокупному количеству элементов, которые они собственные, которые являются «синими», за вычетом количества принадлежащих им предметов, которые являются «красными» в течение запрошенного времени (не спрашивайте почему):

  • минимальное значение любого владельца (в течение запрошенного времени)
  • максимальное значение любого владельца (в течение запрошенного времени)
  • среднее значение всех владельцев (в течение запрошенного времени)
  • медианное значение всех владельцев (в течение запрошенного времени)
  • стоимость конкретного владельца (в запрошенное время)

1 Ответ

0 голосов
/ 28 мая 2020

Настройте индекс:

PUT colorful
{
  "mappings": {
    "properties": {
      "date": {
        "type": "date"
      },
      "owner": {
        "type": "integer"
      },
      "color": {
        "type": "keyword"
      }
    }
  }
}

Вставьте несколько документов

POST colorful/_doc
{"date":"2020-05-28T19:56:12.237Z","owner":131351351,"color":"red"}

POST colorful/_doc
{"date":"2020-04-28T19:58:02.110Z","owner":35135125,"color":"purple"}

POST colorful/_doc
{"date":"2020-05-15T19:58:15.966Z","owner":997654341,"color":"blue"}

POST colorful/_doc
{"date":"2020-05-21T19:58:35.766Z","owner":366449,"color":"red"}

Фильтр по диапазону дат и агрегату. Мин., Макс., Сред. (= Среднее) можно рассчитать, используя stats, для median там percentiles[50]. Не уверен, что вы имели в виду под a particular owner's value, но фактические документы с фильтрацией по диапазону можно получить, используя top_hits, плюс вы можете добавить фильтр для спецификаций c do c.

GET colorful/_search
{
  "size": 0,
  "query": {
    "range": {
      "date": {
        "gte": "now-3M",
        "lte": "now-1h"
      }
    }
  },
  "aggs": {
    "1)general_stats": {
      "stats": {
        "field": "owner"
      }
    },
    "2)median": {
      "percentiles": {
        "field": "owner",
        "percents": [
          50
        ]
      }
    },
    "3)top_hits": {
      "top_hits": {
        "size": 10
      }
    }
  }
}
...