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"}}
}
始まりの旋律
29才の
外人の少年です。。
いろいろ興味があって
なんとかできるようになりたくて
残してみます。
案外けっこう頑張ってますね。
ただ、
いい人になれたらと
思います。