2014-09-12 5 views
4

Я знаю, что elasticsearch разрешает sub-aggregations (т. Е. Вложенную агрегацию), однако я бы хотел применить агрегацию к результату «первой» агрегации (или в обобщенном агрегировании любого запроса).Elasticsearch и агрегация подзапросов

Конкретный пример: я регистрирую события о действиях пользователя (для простоты у меня есть документы с user_id и action). Я могу сделать запрос, который подсчитывает количество действий, выполняемых каждым пользователем. Однако я хотел бы узнать процент (или количество) активных пользователей (например, пользователей, выполнивших более 10 действий). Идеальным результатом будет histogram для всех пользователей, показывающих, насколько активны пользователи.

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

Примечание: Я видел Elastic Search and "sub queries" вопрос, но это было о чем-то другом, и ему исполнилось полтора года, и elasticsearch активно развивается.

Кроме того, похоже, что в версии 1.4 будет доступна сценарированная агрегирование показателей, но в любом случае потребуется хранить счетчик для каждого пользователя до этапа уменьшения. И некоторое «приблизительное решение» хорошо для меня - подобно тому, как ES использует internally for its aggregations.

+0

довольно уверен, что ответ заключается в том, что вы не можете агрегировать результаты агрегирования в настоящее время (я хотел, чтобы по другим причинам и не нашел способ сделать это) - +1 на вопрос, чтобы увидеть если кто-то еще хорошая идея – Alcanzar

ответ

2

Вот запрос, который я использовал, обратите внимание на «min_doc_count» в агрегации.

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "and": [ 
      { "term" : { "name": "did x" } }, 
      { "range": { "created_at": { "gte": "now-7d", "lte": "now" } } } 
     ] 
     } 
    } 
    }, 
    "aggregations": { 
    "my_agg": { 
     "terms": { 
     "field": "user_id", 
     "min_doc_count": 10, 
     "size": 0 
     } 
    } 
    } 
} 

Этот запрос возвращает список ковшей (пользователей) с более чем 9 событиями за указанный период времени. Просто «подсчитайте» результаты, чтобы получить количество активных пользователей.

Я проверил этот подход с тысячами событий, и он работает хорошо. В определенном масштабе вам придется использовать Hadoop.

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