Скриптовый расчет агрегации с неожиданными результатами - PullRequest
0 голосов
/ 15 марта 2020

Во-первых, я немного новичок в ES / SK и, тем более, в аггригациях.

Вот моя структура аггов:

  aggs: {
    all_budgets: {
      sum: {
        field: :amount
      }
    },
    all_forecasts: {
      sum: {
        field: :forecast_total
      }
    },
    all_variance: {
      sum: {
        script: "doc['forecast_total'].value - doc['amount'].value"
      }
    },
    all_variance_p: {
      sum: {
        script: "(doc['forecast_total'].value - doc['amount'].value) / doc['amount'].value"
      }
    }

  }

Я в основном пытаюсь получить общее количество все мои бюджеты, всего потрачено, а затем больше / меньше по сравнению с бюджетом и соответствующий%. Вот мой вывод:

{
  "all_forecasts": {
    "doc_count": 2,
    "value": 173604.0
  },
  "all_budgets": {
    "doc_count": 2,
    "value": 185437.0
  },
  "all_variance_p": {
    "doc_count": 2,
    "value": "0.33694326595832774"
  },
  "all_variance": {
    "doc_count": 2,
    "value": -11833.0
  }
}

Неверное значение «0.33694326595832774» - должно быть «-0.06408106257» (т.е. -11833.0 / 185437.0). Первые два сценария работают, и я подозреваю, что просто не понимаю, как эти сценарии работают.

Ответы [ 2 ]

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

В ответ на ваши комментарии, чтобы получить доступ к окончательным значениям all_budgets и all_forecasts для дальнейшего расчета, вы можете использовать агрегацию скрипта сегмента , которая может получить доступ к родительскому агрегации с использованием пути сегмента. Поскольку для работы требуются сегменты, вам нужно добавить родительскую агрегацию ex date_histogram, которая разбивает документы в заданном интервале (год или месяц или дата и т. Д. c)

{
  "size": 0,
  "aggs": {
    "year_interval": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "year"
      },
      "aggs": {
        "all_budgets": {
          "sum": {
            "field": "amount"
          }
        },
        "all_forecasts": {
          "sum": {
            "field": "forecast"
          }
        },
        "all_variance": {
          "bucket_script": {
            "buckets_path": {
              "total_forecast":"all_forecasts",
              "total_budget":"all_budgets"
            },
            "script": "params.total_forecast-params.total_budget"
          }
        },
        "all_variance_p": {
          "bucket_script": {
            "buckets_path": {
              "variance":"all_variance",
              "budget":"all_budgets"
            },
            "script": "params.variance/params.budget"
          }
        }
      }
    }
  }
}

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

Попробуйте привести свои числа к одному и тому же типу данных , прежде чем делить. Например ((float)(doc['forecast_total'].value) - (float)(doc['amount'].value)) / (float)(doc['amount'].value)).

...