Почему я не могу обратиться к этому значению агрегации из bucket_path и вернуть логическое значение? - PullRequest
0 голосов
/ 30 мая 2019

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

Каждый документ имеет поле SubOperation, которое выглядит как name-start или name-finish вместе с деталями, которые однозначно описывают покупку.

Это запрос, который я пытаюсь выполнить:

POST /logs/_search?size=0
{
  "aggs": {
    "Invoice": {
      "terms": {
        "field": "InvoiceNumber"
      },
      "aggs": {
        "Branch": {
          "terms": {
            "field": "Branch"
          },
          "aggs" : {
            "Operation" : {
              "terms": {
                "script" : "return Arrays.asList(/-/.split(doc['SubOperation.keyword'].value))[0];"
              },
              "aggs": {
                "started": {
                  "terms": {
                    "script" : "return Arrays.asList(/-/.split(doc['SubOperation.keyword'].value))[1] == \"start\";"
                  },
                  "aggs" : {
                    "start_cnt" : {
                      "value_count" : {
                          "field" : "SubOperation.keyword"
                        }
                    }
                  }
                },
                "finished": {
                  "terms": {
                    "script" : "return Arrays.asList(/-/.split(doc['SubOperation.keyword'].value))[1] == \"finish\";"
                  },
                  "aggs" : {
                    "finish_cnt" : {
                      "value_count" : {
                        "field" : "SubOperation.keyword"
                      }
                    }
                  }
                },
                "is_finished" : { 
                  "bucket_script": {
                    "buckets_path": {
                      "s": "started>start_cnt",
                      "f": "finished>finish_cnt"
                    },
                    "script": "return params.f;"
                  }
                }
              }
            }
          }
        }
      } 
    }
  }
} 

И ответ дан:

{
  "error": {
    "root_cause": [],
    "type": "search_phase_execution_exception",
    "reason": "",
    "phase": "fetch",
    "grouped": true,
    "failed_shards": [],
    "caused_by": {
      "type": "aggregation_execution_exception",
      "reason": "buckets_path must reference either a number value or a single value numeric metric aggregation, got: java.lang.Object[]"
    }
  },
  "status": 503
}

Я понял, что агрегация value_count является допустимым агрегированием для использования с bucket_path. Так что здесь происходит? Я также читал, что спецификация многоуровневого агрегирования может вызвать эту ошибку, но в моем случае есть только один уровень вниз (один «>» в ​​соответствующем разделе is_finished).

А также, когда я пытаюсь изменить эту строку:

"script": "return params.f;"

Кому:

"script": "return params.f == 1;"

Я получаю:

  "error": {
    "root_cause": [],
    "type": "search_phase_execution_exception",
    "reason": "",
    "phase": "fetch",
    "grouped": true,
    "failed_shards": [],
    "caused_by": {
      "type": "script_exception",
      "reason": "compile error",
      "script_stack": [
        "return params.f == 1;",
        "       ^---- HERE"
      ],
      "script": "return params.f == 1;",
      "lang": "painless",
      "caused_by": {
        "type": "class_cast_exception",
        "reason": "Cannot cast from [boolean] to [java.lang.Number]."
      }
    }
  },
  "status": 503
}

Это также происходит, когда я пытаюсь сделать что-нибудь полезное с данными, полученными из bucket_path, например: return (params.s == 1) && (params.f == 1);

Как я могу исправить этот запрос или, альтернативно, как я могу сделать это лучше?

...