2016-11-04 13 views
0

私はElasticsearchでいくつかのパーセンテージを計算しようとしていますが、(小さな)問題があります。私はESに以下を計算させたい: "(勝/総)* 100"。Elasticsearch - Bucket_scriptとbuckets_pathsが "集約タイプを見つけることができませんでした"を返す

は、だから私は、コメントを追加しました:のように見える私のES要求に

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

{ 
    "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の両方が同じ親集計から1つの数値で来る必要があり、可能ではない。

しかし、それは init_script 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}" 
     } 
    } 
    } 
} 
  • によって解決することができる3つの変数を初期化します。 win_status配列には、勝利ステータスに対応するすべての値があります。
  • map_script status.raw値がwin_statusにある場合は、すべての文書を通じて反復処理し、その後、win_countがインクリメントされ、それががインクリメントされ、すべてのTOTAL_COUNTで任意の値を持っている場合(あなたが条件ならば、これを削除することもできますあなたはまた、NULL値を含める場合)
  • combine_scriptはシャードごとにすべての値
  • reduce_script合計のすべての値と、その後のジを取得しますそれを呼び出す。また、ゼロで割り切れないようにチェックするか、スクリプトが例外をスローします。
+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 –

関連する問題