У меня есть псевдоним индекса в 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);
Как я могу исправить этот запрос или, альтернативно, как я могу сделать это лучше?