Elasticsearch получает уникальное количество полей только один раз в диапазоне дат - PullRequest
0 голосов
/ 28 марта 2020

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

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

 user_id_1   2020-01-05
 user_id_1   2020-02-06
 user_id_1   2020-02-14
 user_id_2   2020-02-03
 user_id_2   2020-02-04
 user_id_3   2020-03-03
 user_id_1   2020-03-15
 user_id_2   2020-03-21
 user_id_3   2020-03-25
 user_id_3   2020-04-01

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

user_id_1 | 1 count | 2020-01-05
user_id_2 | 1 count | 2020-02-03
user_id_3 | 1 count | 2020-03-03
Total     | 3 counts|

Вот пример кода, который я придумал. Он подсчитывает количество экземпляров user_ids, которые появляются в данный период.

{
   "size":0,
   "aggs":{
      "result":{
         "date_range":{
            "field":"timestamp",
            "format":"yyyy-MM-dd",
            "ranges":[
               {
                  "from":"2020-01-01",
                  "to":"2020-03-31"
               }
            ]
         },
         "aggs":{
            "histogram":{
               "date_histogram":{
                  "field":"timestamp",
                  "calendar_interval":"1M",
                  "extended_bounds":{
                     "min":"2020-01-01",
                     "max":"2020-03-31"
                  },
                  "format":"yyyy-MM-dd"
               },
               "aggs":{
                  "user_sigups":{
                     "terms":{
                        "field":"user_id.keyword"
                     }
                  }
               }
            }
         }
      }
   }
}

Пример результата вышеприведенного запроса выглядит следующим образом.

{
   "histogram":{
      "buckets":[
         {
            "key_as_string":"2020-01-01",
            "key":1577836800000,
            "doc_count":1925,
            "user_sigups":{
               "doc_count_error_upper_bound":0,
               "sum_other_doc_count":328,
               "buckets":[
                  {
                     "key":"2532456443539602",
                     "doc_count":505
                  }
               ]
            }
         }
      ]
   }
}

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 марта 2020

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

Запрос:

{
  "size": 0,
  "aggs": {
    "result": {
      "date_range": {
        "field": "timestamp",
        "format": "yyyy-MM-dd",
        "ranges": [
          {
            "from": "2020-01-01",
            "to": "2020-03-31"
          }
        ]
      },
      "aggs": {
        "histogram": {
          "date_histogram": {
            "field": "date",
            "interval": "1M",
            "extended_bounds": {
              "min": "2020-01-01",
              "max": "2020-03-31"
            },
            "format": "yyyy-MM-dd"
          },
          "aggs": {
            "user_sigups": {
              "terms": {
                "field": "user_id.keyword"
              },
             "aggs": {
               "unique_count": {
                 "cardinality": {
                   "field": "user_id.keyword"
                 }
               },
               "min_date":{
                 "min": {
                   "field": "timestamp"
                 }
               }
             }
            }
          }
        }
      }
    }
  }
}

Результат:

"aggregations" : {
    "result" : {
      "buckets" : [
        {
          "key" : "2020-01-01-2020-03-31",
          "from" : 1.5778368E12,
          "from_as_string" : "2020-01-01",
          "to" : 1.5856128E12,
          "to_as_string" : "2020-03-31",
          "doc_count" : 9,
          "histogram" : {
            "buckets" : [
              {
                "key_as_string" : "2020-01-01",
                "key" : 1577836800000,
                "doc_count" : 1,
                "user_sigups" : {
                  "doc_count_error_upper_bound" : 0,
                  "sum_other_doc_count" : 0,
                  "buckets" : [
                    {
                      "key" : "user_id_1",
                      "doc_count" : 1,
                      "min_date" : {
                        "value" : 1.5781824E12,
                        "value_as_string" : "2020-01-05"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    }
                  ]
                }
              },
              {
                "key_as_string" : "2020-02-01",
                "key" : 1580515200000,
                "doc_count" : 4,
                "user_sigups" : {
                  "doc_count_error_upper_bound" : 0,
                  "sum_other_doc_count" : 0,
                  "buckets" : [
                    {
                      "key" : "user_id_1",
                      "doc_count" : 2,
                      "min_date" : {
                        "value" : 1.5809472E12,
                        "value_as_string" : "2020-02-06"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    },
                    {
                      "key" : "user_id_2",
                      "doc_count" : 2,
                      "min_date" : {
                        "value" : 1.580688E12,
                        "value_as_string" : "2020-02-03"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    }
                  ]
                }
              },
              {
                "key_as_string" : "2020-03-01",
                "key" : 1583020800000,
                "doc_count" : 4,
                "user_sigups" : {
                  "doc_count_error_upper_bound" : 0,
                  "sum_other_doc_count" : 0,
                  "buckets" : [
                    {
                      "key" : "user_id_3",
                      "doc_count" : 2,
                      "min_date" : {
                        "value" : 1.5831936E12,
                        "value_as_string" : "2020-03-03"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    },
                    {
                      "key" : "user_id_1",
                      "doc_count" : 1,
                      "min_date" : {
                        "value" : 1.5842304E12,
                        "value_as_string" : "2020-03-15"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    },
                    {
                      "key" : "user_id_2",
                      "doc_count" : 1,
                      "min_date" : {
                        "value" : 1.5847488E12,
                        "value_as_string" : "2020-03-21"
                      },
                      "unique_count" : {
                        "value" : 1
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }

Позвольте мне знаю, как это работает для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...