Вычислить разницу в агрегации data_histogram - PullRequest
0 голосов
/ 19 октября 2018

Есть коллекция клиентов, которую я хочу проанализировать.Меня интересует рост числа клиентов, например:

  • + 43 (+ 32%) новых клиентов с прошлой недели
  • + 12650 (+ 1140%) новых клиентов с прошлого года

Что делать:

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

Итак, сначала я бы создал гистограмму для распределения клиентов по неделям:

{  
  "aggs":{  
    "customers_over_time":{  
      "date_histogram":{  
        "field":"created",
        "interval":"week"
      }
    }
  }
}

Это, например, приводит к

{  
  "buckets":[  
    ...,
    {  
      "key_as_string":"2018-10-01T00:00:00.000Z",
      "key":1538352000000,
      "doc_count":1
    },
    {  
      "key_as_string":"2018-10-08T00:00:00.000Z",
      "key":1538956800000,
      "doc_count":7
    },
    {  
      "key_as_string":"2018-10-15T00:00:00.000Z",
      "key":1539561600000,
      "doc_count":5
    }
  ]
}

Затем я бы просто взял последние две записи, вычислил разницу и назначил ее для поля за пределами набора сегментов.Возможно ли это вasticsearch, возможно, через Агрегация сценариев ведра ?

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

{  
  "query":{  
    "range":{  
      "created":{  
        "gte":"now-1w",
        "lte":"now"
      }
    }
  }
}

Однако это учитывает не всю последнюю неделю, а только последние 7 дней, что не совпадает с прошлой неделей.Можно ли создать клиентов на этой и на прошлой неделе?

1 Ответ

0 голосов
/ 21 октября 2018

Ну, я попробовал кое-что, и я надеюсь, что это будет полезно.Я использовал функцию Serial Difference Aggregation Elasticsearch, и вы можете обратиться к этой LINK для получения более подробной информации.

Допустим, у меня есть three документов за эту неделю, т.е. week starting from 2018-10-15 и только one документ за последнюю неделю, т. Е. week starting from 2018-10-08

Разница пользователей, созданных в течение недели 2018-10-15будет 2

Ниже приведен пример запроса, с которым я столкнулся, который показал бы вам разницу по сравнению с предыдущей неделей.

Запрос

POST testdateindex/_search
{
  "size" : 0,
  "query" : {
    "bool" : {
      "must" : {
        "range" : {
          "created" : {
            "from":"now-2w",
            "to":"now",
            "include_lower" : true,
            "include_upper" : true
          }
        }
      }
    }
  },
  "aggs": {
    "customers_over_time": {
      "date_histogram": {
        "field": "created",
        "interval": "week"
      },
      "aggs": {
            "difference": {
               "serial_diff": {                
                  "buckets_path": "_count",
                  "lag" : 1
               }
            }
         }
    }
  }
}

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

Результат запроса:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "customers_over_time": {
      "buckets": [
        {
          "key_as_string": "2018-10-08T00:00:00.000Z",
          "key": 1538956800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2018-10-15T00:00:00.000Z",
          "key": 1539561600000,
          "doc_count": 3,
          "difference": {
            "value": 2
          }
        }
      ]
    }
  }
}

В результате будет отображаться количество всех документов за эту неделю вместе с частью difference в указанном выше json, которая будет содержать разницу в числе к числуна прошлой неделе.

Обратите внимание, что в первом сегменте нет difference, потому что я не создавал никаких документов до этой недели.

Надеюсь, это поможет!

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