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なので)