В одной из заметок, Забираем звонки из Webitel, я описал, как с помощью REST API вы можете забирать информацию о звонках из Webitel. Сегодня мы рассмотрим на примере Звонки по направлениям, как работать с агрегациями и показателями. Для лучшего понимания примера, настоятельно рекомендую ознакомится с разделом агрегации документации по elasticsearch.
Предположим, что нам нужно рассчитать количество, а так же показатели общей и средней длительности звонков по направлениям за текущие сутки. Тело запроса будет иметь следующий вид:
{ "index": "cdr-a", "limit": 0, "aggs": { "direction": { "terms": { "field": "direction", "order": { "_count": "desc" }, "size": 5 }, "aggs": { "talksec_sum": { "sum": { "field": "talksec" } }, "talksec_avg": { "avg": { "field": "talksec" } } } } }, "filter": [ { "bool": { "must": [ { "range": { "created_time": { "gte": "now/d", "lte": "now" } } } ] } } ] }
В нашем запросе группировка происходит по полю direction, а среднее и суммарное значение мы вычисляем по полю talksec. Дополнительно мы добавляем фильтр по времени: от текущей даты до начала суток.
Запрос с помощью утилиты cURL будет иметь вид:
curl -s -L -XPOST \ -H 'Content-Type: application/json' \ -H 'X-Access-Token: eyJMDU0NjAwMDAwMCwhaW4iLCJ2IjoyfQ.VeWrCqkv_lG1bLVv6tvOFPz2XfhiTpQG8XcFji8gSS4'\ "https://cloud-eu.webitel.com/engine/api/v2/cdr/text" -d@calls_by_direction.json
В результате мы получим JSON документ с результатом запроса в объекте aggregations, который уже легко можем обработать любимыми инструментами:
{ "took": 45, "timed_out": false, "_shards": { "total": 33, "successful": 33, "skipped": 0, "failed": 0 }, "hits": { "total": 343, "max_score": 0, "hits": [] }, "aggregations": { "direction": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "outbound", "doc_count": 209, "talksec_sum": { "value": 7093 }, "talksec_avg": { "value": 55.4140625 } }, { "key": "inbound", "doc_count": 94, "talksec_sum": { "value": 2430 }, "talksec_avg": { "value": 73.63636363636364 } }, { "key": "internal", "doc_count": 12, "talksec_sum": { "value": 172 }, "talksec_avg": { "value": 24.571428571428573 } } ] } } }