2017-05-10 22 views
0

集計を調べていて、painlessを使用してスクリプトを作成しましたが、すべての値を繰り返し/合計する方法はわかりませんオブジェクト。ElasticSearch/Painless:オブジェクト内のすべての値をアクセス/合計するには

例:、私は基本的に、50.0 + 20.5 + 30.5に範囲クエリを実行する、または

{ 
    "field1" : { 
    "subfield1": 50.0, 
    "subfield2": 20.5, 
    "subfield3": 30.5 
    } 
} 

私のマッピングが

"field1": { 
    "properties": { 
    "subfield1": { 
     "type": "float" 
    }, 
    "subfield2": { 
     "type": "float" 
    }, 
    "subfield3": { 
     "type": "float" 
    } 
    } 
} 

のは、私のデータは次のようになりますと仮定しましょうように見えます何らかの形でfield1オブジェクト内のすべての値にアクセスします。

集計でフィールドにワイルドカードを使用することはできません。 私はlooking at the code for LeafDocLookup(痛みのないように内部で使用されていました)でした。関連する方法が無効になっています。

私はこのようなスクリプトを書くことができた:

"query": { 
    "script": { 
    "script": { 
     "inline": "return (doc['field1.subfield1'].value + doc['field1.subfield2'].value + doc['field1.subfield3'].value > 50);", 
     "lang": "painless" 
    } 
    } 
} 

が、これは明らかに、最適で、かつ動的なキーの主な問題を解決していません。

+0

を使用する場合は、文書を作成または更新するときに、サブ鍵の合計(つまり合計)を格納できるJava HashMapオブジェクトとしてオブジェクトにアクセスすることができますか?次に、照会するフィールドが1つだけあり、動的キー名について心配する必要はありません。 – Phil

+0

私は可能ですが、ハッシュマップのすべての要素にアクセスする必要があるユースケースが増えていると確信しています。正確に 'keySet()'や 'values()'のようなメソッドがあるのはなぜですか? – shashwat

+1

Painlessはフィールドのすべてのサブオブジェクトの取得をサポートしていますが、一般的にはESクエリでスクリプトを使用しないことをお勧めします。それらは遅く、通常、スクリプトを避けるために文書を照会または保管するためのより良い方法があります。 – Phil

答えて

1

私はそれをついに見つけました! elasticsearch内のdocオブジェクトでは使用できませんが、はで利用可能なです。

だから、私は私がparams['_source']

"query": { 
    "script": { 
    "script": { 
     "inline": "float sum = 0.0f; for (float v: params['_source'].values()) { sum += v; } return (sum > 50);", 
     "lang": "painless" 
    } 
    } 
} 
関連する問題