Elasticsearch, 2次元配列の特定列のデータを取得


■Elasticsearchの中に、下記のようにarrayの組み合わせのデータがあります。

[

 [x1,y1,z1],
 [x2,y2,z2],
 [x3,y3,z3],
 [x4,y4,z4]

]

ここで、特定indexのデータ(y1,y2,y3,y4)のみ取得したいです。

そのscriptは下記のようになります。

 

■サンプルデータ
PUT hockey/player/_bulk?refresh
{"index":{"_id":1}}
{"first":"johnny","last":"gaudreau","goals":[["9","27","1"],["9","24","1"]],"assists":[1,46,0],"gp":[26,82,1],"born":"1993/08/13"}
{"index":{"_id":2}}
{"first":"johnny","last":"gaudreau","goals":[["99","44","55"],["9","77","88"]],"assists":[17,46,0],"gp":[26,82,1],"born":"1993/08/13"}

 

■サンプルクエリ

GET hockey/_search
{
"query": {
"match_all": {}
},
"script_fields": {
"for_toString": {
"script": {
"lang": "painless",
"inline": "int total = 0; List x = new ArrayList(); for (int i = 0; i < params['_source']['goals'].length; i++) { x.add(params['_source']['goals'][i][1]); } return x;"
}
}
}
}

 ※とにかくinline scriptで作った結果データはこう出力するっていうのがポイントですね。これに気づくのに結構苦労しました。

inlineフィールドのデータは、一つのメソットの中で、出力したいデータをreturnすればいいんですね。

それが複数だったら、arrayやlistなどに入れてreturn.

(listなど使わず、

結局toString()されるので、for(){str+=data}の形がいいかも知れません。)

 

※パフォーマンスは。。。

 (params['_source']を使っているのは、パフォーマンスよりメモリ容量が気になるPJなので)