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

 

 

 

Elasticsearch, doc, source, all

Elasticsearch上でデータを読むとき、

doc, source, all

fieldを使うことができる。

 

じゃ、例えばupdate with queryのpainless scriptで参照する時、

どっちが早いか。

 

下記の文書を見ると、_docを参照するほうが一番いいらしい。

 

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-docvalue-fields.html

 

Elasticsearch, 排他, 原子性, transaction関連

■一個のdocumentのupdateに関しては原子的。

https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html

 

 

■だが、bulkを使って複数のdocumnetをupdateする場合は

 

bulk単位のtransacionは保証しない。

 

例えば、bulkで100件のdocumentにupdateを掛ける。

bulkが行われう中、50件目でversion conflictが発生して、中止になると、

49目まで行ったupdateは反映される。そこまでの変更を破棄したりしない。

Elasticsearch, script, 複数field update

Elasticsearchで、scirpt(painless)を使う時、

区切りを付けるとき、";" します。

 

下記みたく、複数のfieldをupdateする時など

使えますね。


POST /plays/_update_by_query
{
"script":{
"inline":"ctx._source.year = '1988'; ctx._source.title = 'updated'",
"lang":"painless"

},

"query":{"term":{"year": "2017"}}
}

 

 

www.compose.com

 

始まりの旋律

 

 

29才の

外人の少年です。。

 

いろいろ興味があって

なんとかできるようになりたくて

残してみます。

 

案外けっこう頑張ってますね。

 

ただ、

いい人になれたらと

思います。