1

У меня есть данные с карт и, например, как следующие:Уникальный термин в ведро в elasticsearch

{ 
    date : 'yyyy-mm-dd', 
    action : 'click', 
    userId : 'not_analysed id in this field', 
    user : { 
    name : 'John', 
    age : '28', 
    email : '[email protected]', 
    country : 'US' 
    } 
} 

Я бы миллионы записей, как это, которые также имеют дублирование, как это журналы активности пользователя, и я хотел бы группируйте их на основе уникальной даты в гистограмме даты с использованием столбца даты. Очень просто использовать мощность, чтобы получить уникальный счет на основе гистограммы даты.

Если я хочу получить конечный результат на основе уникального пользовательского ведра и сгруппировать поле пользователя и получить их счет на основе их профиля, как следует. Скажем, в месяце Ян, у нас есть около 10 000 операций, но только 1000 уникальных пользователей и на основе этих пользователей, мы хотели бы получить данные поля пользователя, чтобы увидеть демографические данные. Имея в виду 10 000 записей, и если вы выполняете мощность на userId, у меня будет 1000 записей. Основываясь на этом 1000 записей, мне нужно иметь следующие результаты. Как консолидировать от 10 000 записей к отдельным тысячам записей и из этих записей сделать это ответы, как показано ниже.

Expected end results: 
{ 
    '2016-01-01', 
    aggs: { 
     [{ 
      age: 28, 
      count: 100 
     }, { 
      age: 27, 
      count: 500 
     }, { 
      country: 'US', 
      count: 200 
     }, { 
      country: 'Canada', 
      count: 200 
     }] 
    }, 
    '2016-02-01', 
    aggs: { 
     [{ 
      age: 29, 
      count: 200 
     }, { 
      age: 31, 
      count: 1000 
     }, { 
      country: 'Mexico', 
      count: 400 
     }, { 
      country: 'UK', 
      count: 400 
     }] 
    } 

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

Пожалуйста, помогите.

+0

мое решение ниже решило вашу проблему? –

ответ

0

Что вам нужно, это 3 разных субагрегирования в рамках основных гистограмм даты-гистограммы. Ваш запрос будет выглядеть примерно так.

Запрос состоит из terms агрегации для age и country данных и cardinality для подсчета количества уникальных пользователей.

Вы можете увеличить размер каждой агрегирования терминов, чтобы получить желаемый результат.

{ 
    "aggs": { 
    "user_data_over_time": { 
     "date_histogram": { 
     "field": "date", 
     "interval": "day", 
     "format": "yyyy-MM-dd" 
     }, 
     "aggs": { 
     "unique_users": { 
      "cardinality": { 
      "field": "userId" 
      } 
     }, 
     "age_data":{ 
      "terms": { 
      "field": "user.age", 
      "size": 10 
      } 
     }, 
     "country_data":{ 
      "terms": { 
      "field": "user.country", 
      "size": 10 
      } 
     } 
     } 
    } 
    } 
} 
+0

Да, это получило бы счет, но user.age основывается на общих записях, но не на количестве отдельных userId. – Nick

+0

@ Ник, поэтому ваш пользователь и пользователь не связаны, и вам понадобится возраст для каждого пользователя? можете ли вы уточнить свое требование вывода, поскольку на основании приведенного вами примера 1000 являются уникальными пользователями, из которых 100 имеют возраст 28 и 500 лет в возрасте 27 лет. Если это требование, то над запросом определенно будет работать. –

+0

скажем, что общее количество записей составляет 10 000 с множественным дублированием userId через 10 000. Тогда, разное количество userId - 1000. Основываясь на этом отдельном 1000 пользователей, мне понадобится возраст и группа стран. Таким образом, возрастная группа будет основана только на 1000, а фактические записи - 10 000. – Nick