2015-12-23 3 views
1

В настоящее время я пытаюсь создать графики из данных, собранных в Elastic Search. Каждый раз, когда генерируется пользователь, я вставить запись в ES, имеющей следующий (пример) данные:Использовать doc_count как совокупный счет

{ 
    "country": "US", 
    "id": "79ca9523dcd62420030de12b75e08bb7", 
    "createdAt": "1450912898" 
} 

идентификатора хэш идентификатора пользователя, так что идентификатор пользователя не может быть определен из ID хранятся в ES, в целях конфиденциальности.

Тип отображения в индексе ES выглядит следующим образом:

{ 
    "user": { 
    "_timestamp": { 
     "enabled": true 
    }, 
    "properties": { 
     "country": { 
     "type": "string" 
     }, 
     "createdAt": { 
     "type": "date", 
     "format": "epoch_second" 
     }, 
     "id": { 
     "type": "string", 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 

Теперь, чтобы получить график пользователей в день, у меня есть следующий запрос:

{ 
    "size": 0, 
    "query": { 
    "type": { 
     "value": "user" 
    } 
    }, 
    "aggs": { 
    "users_per_day": { 
     "date_histogram": { 
     "field": "createdAt", 
     "interval": "day" 
     } 
    } 
    } 
} 

Это дает мне хороший результат, такой как этот (для результата я установил интервал на минуту, чтобы дать вам небольшое представление о том, в чем проблема):

[{ 
    "key_as_string": "1450909920", 
    "key": 1450909920000, 
    "doc_count": 8 
}, 
{ 
    "key_as_string": "1450909980", 
    "key": 1450909980000, 
    "doc_count": 2 
}, 
{ 
    "key_as_string": "1450910040", 
    "key": 1450910040000, 
    "doc_count": 5 
}, 
{ 
    "key_as_string": "1450910100", 
    "key": 1450910100000, 
    "doc_count": 8 
}, 
{ 
    "key_as_string": "1450910160", 
    "key": 1450910160000, 
    "doc_count": 4 
}, 
{ 
    "key_as_string": "1450910220", 
    "key": 1450910220000, 
    "doc_count": 3 
}, 
{ 
    "key_as_string": "1450910280", 
    "key": 1450910280000, 
    "doc_count": 6 
}] 

Я бы хотел использовать doc_count для генерации совокупного графика, чтобы я мог видеть рост моей пользовательской базы, а не количество счетов, сделанных за день. Несмотря на поиск в Интернете, я не могу найти ни одного ответа, который, похоже, связан с моим вопросом. Большинство ответов, которые я нахожу, направляют меня на страницу Cumulative Sum Aggregation, но приведенный здесь пример даст вам совокупную сумму всех результатов, полученных в одном ведре. Я бы хотел получить суммарную сумму всех сумм.

+0

Итак, следуя вашему примеру, '' doc_count' для "key_as_string": "1450909980" 'должно быть 8 (предыдущая doc_count) + 2? –

+0

Это необязательно должно храниться в doc_count, но да. –

+0

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

ответ

3

Вы на правильном пути с cumulative sum aggregation, и вы можете определенно использовать его. Вам просто нужно использовать специальный _count bucket path, который будет выполнять ожидаемую работу.

{ 
    "size": 0, 
    "query": { 
    "type": { 
     "value": "user" 
    } 
    }, 
    "aggs": { 
    "users_per_day": { 
     "date_histogram": { 
     "field": "createdAt", 
     "interval": "day" 
     }, 
     "aggs": { 
     "cumulative": { 
      "cumulative_sum": { 
      "buckets_path": "_count" 
      } 
     } 
     } 
    } 
    } 
} 

Результаты будут выглядеть следующим образом:

[{ 
    "key_as_string": "1450909920", 
    "key": 1450909920000, 
    "doc_count": 8, 
    "cumulative": {"value": 8} 
}, 
{ 
    "key_as_string": "1450909980", 
    "key": 1450909980000, 
    "doc_count": 2, 
    "cumulative": {"value": 10} 
}, 
{ 
    "key_as_string": "1450910040", 
    "key": 1450910040000, 
    "doc_count": 5, 
    "cumulative": {"value": 15} 
}, 
{ 
    "key_as_string": "1450910100", 
    "key": 1450910100000, 
    "doc_count": 8, 
    "cumulative": {"value": 23} 
}, 
{ 
    "key_as_string": "1450910160", 
    "key": 1450910160000, 
    "doc_count": 4, 
    "cumulative": {"value": 27} 
}, 
{ 
    "key_as_string": "1450910220", 
    "key": 1450910220000, 
    "doc_count": 3, 
    "cumulative": {"value": 30} 
}, 
{ 
    "key_as_string": "1450910280", 
    "key": 1450910280000, 
    "doc_count": 6, 
    "cumulative": {"value": 36} 
}] 
+0

Спасибо, это именно то, что мне нужно. Я попытался использовать 'doc_count',' count', но не думал о '_count' –

+0

Рад, что это помогло! – Val

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