Elasticsearchでインデックス付きドキュメントを更新する方法を理解しようとしています。それがどのように機能するのか分かりませんか? APIが参照しているctx
は何ですか?ネストされたドキュメントを含むドキュメントがあるとしましょう。それを更新するには何をする必要がありますか?
また、ドキュメントを削除してから「更新された」バージョンにインデックスを付けることと、単純な更新との違いは何ですか?
更新リクエストはElasticsearchからソースを取得し、それを変更して、Elasticsearchにインデックスを付け直します。更新を使用してドキュメントのコピーを既に持っている場合は、ほとんど意味がありません。一般に、新しいバージョンのインデックスを作成する方が高速です。ただし、ドキュメントをすぐに利用できないが、ドキュメントにどの変更を加えたいかがわかっている場合は、更新を使用する方が効率的です。
たとえば、車のドキュメントのコピーを持っていないが、新しい作成者を追加したい場合は、次のようにすることができます。
curl -XDELETE localhost:9200/test
curl -XPUT localhost:9200/test -d '{
"settings": {
"index.number_of_shards": 1,
"index.number_of_replicas": 0
},
"mappings": {
"car": {
"properties": {
"creators" : {
"type": "nested",
"properties": {
"name": {"type":"string"}
}
}
}
}
}
}
'
curl -XPOST localhost:9200/test/car/1 -d '{
"creators": [{
"name": "Steve"
}]
}
'
echo
curl -XPOST localhost:9200/test/car/1/_update -d '{
"script" : "ctx._source.creators += new_creator",
"params" : {
"new_creator" : {"name": "John"}
}
}'
echo
curl "localhost:9200/test/car/1?pretty=true"
echo
更新スクリプトでは、ctx
は、更新するオブジェクトのソースにアクセスできるようにする特別な変数です。 ctx._source
はソースの書き込み可能なバージョンです。スクリプトでこのドキュメントを変更できます。変更されたソースは、ドキュメントの新しいバージョンとして保持されます。
ElasticSearch7.3でネストされた顧客ドキュメントを使用してドキュメントを更新する方法は次のとおりです。
POST /myindex/_doc/mypartid/_update
{
"script" : {
"source": "ctx._source.customers.add(params.newcust)",
"params" : {
"newcust" : {"customer": "cust3"}
}
}
}
結果:
GET /myindex/_doc/mypartid
{
"_index": "myindex2",
"_type": "_doc",
"_id": "mypartid",
...
"_source": {
"part": "my part",
"customers": [
{"customer": "cust1"},
{"customer": "cust3"}
],
"machines": [
{"machine": "mach7"},
{"machine": "mach2"}
]
}
}
そのため、ES7 +の場合、スクリプトの実行方法や配列で実行できる操作と同様にURLが変更されました(+=
動作しません)。