2016-11-04 5 views
0

Я пытаюсь вычислить некоторые проценты с помощью Elasticsearch, но у меня (небольшая) проблема. Я хочу, чтобы ES вычислила следующее: «(побед/Всего) * 100».Elasticsearch - Bucket_script и buckets_paths return «Не удалось найти тип агрегатора»

Поэтому я добавил:

"bucket_script": { 
     "buckets_paths": { 
     "total": "TotalStatus", 
     "wins": "TotalWins" 
     }, 
     "script": " (total/ wins) * 100" 
} 

На мою просьбу ES, который выглядит как:

{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "query": "*", 
      "analyze_wildcard": true 
      } 
     } 
     ], 
     "must_not": [] 
    } 
    }, 
    "aggs": { 
    "status": { 
     "terms": { 
     "field": "status.raw" 
     } 
    }, 
    "wins": { 
     "terms": { 
     "field": "status.raw", 
     "include": { 
      "pattern": "Accepted|Released|Closed" 
     } 
     } 
    }, 
    "losses": { 
     "terms": { 
     "field": "status.raw", 
     "include": { 
      "pattern": "Rejected" 
     } 
     } 
    }, 
    "TotalStatus": { 
     "sum_bucket": { 
     "buckets_path": "status._count" 
     } 
    }, 
    "TotalWins": { 
     "sum_bucket": { 
     "buckets_path": "wins._count" 
     } 
    }, 
    "TotalLosses": { 
     "sum_bucket": { 
     "buckets_path": "losses._count" 
     } 
    } 
    } 
} 

Это, однако, возвращает следующее сообщение об ошибке:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "parsing_exception", 
     "reason": "Could not find aggregator type [buckets_paths] in [bucket_script]", 
     "line": 54, 
     "col": 28 
     } 
    ], 
    "type": "parsing_exception", 
    "reason": "Could not find aggregator type [buckets_paths] in [bucket_script]", 
    "line": 54, 
    "col": 28 
    }, 
    "status": 400 
} 

Любая идея-х?

+0

Какая версия ES вы используете? – Val

+0

Последнее и самое большое: 5.0.0 –

ответ

0

Я много играл с bucket_script, но я думаю, что это может быть невозможно, поскольку это не может быть агрегация верхнего уровня, а также вам нужны как total_wins, так и total_status, исходящие из одной и той же родительской агрегации с одним числовым значением, и я думаю, не возможно.

Но она может быть решена с помощью scripted metric aggregation

{ 
    "size": 0, 
    "aggs": { 
    "win_loss_ratio": { 
     "scripted_metric": { 
     "init_script": "_agg['win_count'] = 0; _agg['total_count'] = 0; _agg['win_status']=['Accepted','Released','Closed'];", 
     "map_script": "if (doc['status.raw'].value in _agg['win_status']) { _agg['win_count']+=1};if (doc['status.raw'].value) { _agg['total_count']+=1}", 
     "combine_script": "return [_agg['win_count'],_agg['total_count']];", 
     "reduce_script": "total_win = 0; total_status_count=0; for (a in _aggs) { total_win += a[0]; total_status_count += a[1] }; if(total_win == 0) {return 0} else {return (total_status_count/total_win) * 100}" 
     } 
    } 
    } 
} 
  • init_script инициализирует три переменные. win_status массив имеет все значения, соответствующие статусу выигрыша.
  • map_script перебирает каждый документ, если значение status.raw находится в win_status затем win_count увеличивается, и если это имеет какое-либо значение на всех TOTAL_COUNT увеличивается на единицу (вы можете удалить это, если условие если вы хотите включить нулевые значения)
  • combine_script получает все значения в осколок
  • reduce_script сумм все значения и затем ди vide. Существует также проверка, чтобы мы не делим на ноль, или скрипт будет генерировать исключение.
+0

Это возвращает: http://pastebin.com/bk3n5r4a:/ –

+0

Я подал [аналогичную ошибку] ​​(https://github.com/elastic/elasticsearch/pull/19863), а мой PR еще не слит, но вы можете опередить, просто определив «params»: {«_agg»: {}} 'в вашей агрегации' script_metric'. – Val

+0

Я просто попробовал это, и, к сожалению, он тоже не работает. Вот изображение: http://imgur.com/a/8Brqx –

 Смежные вопросы

  • Нет связанных вопросов^_^