доступ к вложенной переменной из субагрегации в elasticsearch - PullRequest
1 голос
/ 07 августа 2020

У меня есть индекс с документами, которые выглядят так:

{
    "id": 1,
    "timeline": [{
        "amount": {
            "mpe": 30,
            "drawn": 20
        },
        "interval": {
            "gte": "2020-03-01",
            "lte": "2020-04-01"
        }
    }, {
        "amount": {
            "mpe": 40,
            "drawn": 10
        },
        "interval": {
            "gte": "2020-04-01",
            "lte": "2020-06-01"
        }
    }]
}

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

{
    "aggs": {
        "cp-timeline": {
            "nested": {
                "path": "timeline"
            },
            "aggs": {
                "mpes": {
                    "date_histogram": {
                        "field": "timeline.interval",
                        "calendar_interval": "day"
                    },
                    "aggs": {
                        "sum_mpe": {
                            "sum": {
                                "field": "timeline.amount.mpe"
                            }
                        },
                        "sum_drawn": {
                            "sum": {
                                "field": "timeline.amount.drawn"
                            }
                        }
                    }
                }
            }
        }
    }
}

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

{
    "aggs": {
        "cp-timeline": {
            "nested": {
                "path": "timeline"
            },
            "aggs": {
                "mpes": {
                    "date_histogram": {
                        "field": "timeline.interval",
                        "calendar_interval": "day"
                    },
                    "aggs": {
                        "sum_mpe": {
                            "sum": {
                                "script": "timeline.amount.mpe * 2"
                            }
                        },
                        "sum_drawn": {
                            "sum": {
                                "script": "timeline.amount.drawn * 2"
                            }
                        }
                    }
                }
            }
        }
    }
}

Но я получаю следующую ошибку:

{
    "reason": {
        "type": "script_exception",
        "reason": "compile error",
        "script_stack": [
            "timeline.amount.mpe * 2",
            "^---- HERE"
        ],
        "script": "timeline.amount.mpe * 2",
        "lang": "painless",
        "position": {
            "offset": 0,
            "start": 0,
            "end": 23
        },
        "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Variable [timeline] is not defined."
        }
    }
}

Есть ли способ сделать вложенную переменную, объявленную выше, доступной в скрипте?

1 Ответ

1 голос
/ 07 августа 2020

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

Приведенное ниже должно помочь:

POST <your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "cp-timeline": {
      "nested": {
        "path": "timeline"
      },
      "aggs": {
        "mpes": {
          "date_histogram": {
            "field": "timeline.interval.gte",
            "calendar_interval": "day",
            "min_doc_count": 1                                       <---- Note this
          },
          "aggs": {
            "sum_mpe": {
              "sum": {
                "script": "doc['timeline.amount.mpe'].value * 2"     <---- Note this
              }
            },
            "sum_drawn": {
              "sum": {
                "script": "doc['timeline.amount.drawn'].value * 2"   <---- Note this
              }
            }
          }
        }
      }
    }
  }
}

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

...