web-dev-qa-db-ja.com

Elasticsearchでインデックス付きドキュメントを更新しています

Elasticsearchでインデックス付きドキュメントを更新する方法を理解しようとしています。それがどのように機能するのか分かりませんか? APIが参照しているctxは何ですか?ネストされたドキュメントを含むドキュメントがあるとしましょう。それを更新するには何をする必要がありますか?

また、ドキュメントを削除してから「更新された」バージョンにインデックスを付けることと、単純な更新との違いは何ですか?

18
LuckyLuke

更新リクエストは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はソースの書き込み可能なバージョンです。スクリプトでこのドキュメントを変更できます。変更されたソースは、ドキュメントの新しいバージョンとして保持されます。

35
imotov

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が変更されました(+= 動作しません)。

0
Marc