集計を調べていて、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"
}
}
}
が、これは明らかに、最適で、かつ動的なキーの主な問題を解決していません。
を使用する場合は、文書を作成または更新するときに、サブ鍵の合計(つまり合計)を格納できるJava
HashMap
オブジェクトとしてオブジェクトにアクセスすることができますか?次に、照会するフィールドが1つだけあり、動的キー名について心配する必要はありません。 – Phil私は可能ですが、ハッシュマップのすべての要素にアクセスする必要があるユースケースが増えていると確信しています。正確に 'keySet()'や 'values()'のようなメソッドがあるのはなぜですか? – shashwat
Painlessはフィールドのすべてのサブオブジェクトの取得をサポートしていますが、一般的にはESクエリでスクリプトを使用しないことをお勧めします。それらは遅く、通常、スクリプトを避けるために文書を照会または保管するためのより良い方法があります。 – Phil