2015-11-12 3 views
2

У меня есть документы с полями campaign_id (не уникально), clicks (то же самое для каждого campaign_id). Как посчитать сумму уникальных campaign_id s clicks. напримерКак получить отдельные документы в elasticsearch

campaign_id=1, clicks=2; 
campaign_id=2, clicks=3; 
campaign_id=1, clicks=2; 

Сумма уникальных campaign_id «ы clicks будет 5.

Основная идея заключается в том, чтобы получить документы с уникальным campaign_ids, а затем сумму.
Как создать такой запрос в Elasticsearch?

Пытался достичь этого, используя фильтры внутри агрегации, но фильтр должен быть ведром вместо метрик.

+0

try aggregate function –

ответ

2

Самого простой подход к этому является с pipeline aggregations в ES 2.0, с использованием max агрегации первой, чтобы получить одно значение (так как вы сказали, что тот же campaign_id имеет то же clicks значения), а затем агрегация sum_bucket трубопровода, чтобы получить окончательная сумма:

{ 
    "size": 0, 
    "aggs": { 
    "unique_ids": { 
     "terms": { 
     "field": "campaign_id", 
     "size": 10 
     }, 
     "aggs": { 
     "one_value": { 
      "max": { 
      "field": "clicks" 
      } 
     } 
     } 
    }, 
    "sum_uniques": { 
     "sum_bucket": { 
     "buckets_path": "unique_ids>one_value" 
     } 
    } 
    } 
} 
+0

благодарит за ваш ответ. да, это возможно в версии 2.0, но мы все еще используем 1.7. – Igor

+0

Я не думаю, что это возможно в 1.7. Агрегаты трубопроводов являются одной из основных функций 2.0, и пользователи долгое время хотели чего-то подобного. –

Смежные вопросы