2016-07-28 4 views
0

Dieser Code funktioniert wie erwartet. Aber anstatt das Drittland als weiteres Dokument hinzuzufügen, möchte ich das erste Dokument aktualisieren.Aktualisieren Sie ein elasticsearch Dokument

DELETE /test_index 

PUT /test_index 

PUT /test_index/doc/1 
{ 
    "parent": [ 
     { 
     "name": "India", 
     "label": "IN" 
     }, 
     { 
     "name": "China", 
     "label": "CN" 
     } 
    ] 
} 

PUT /test_index/doc/2 
{ 
    "parent": [ 
     { 
     "name": "Pakistan", 
     "label": "PK" 
     } 
    ] 
} 

So, dass die Dokument-ID 1 3 Länder Indien, China und Pakistan haben wird. Ich denke, ich brauche Update API mit doc_as_upsert Parameter. Aber ich bin mir nicht sicher, wie ich das JSON schreiben soll.

+0

siehe: https://www.elastic.co/guide/en/elasticsearch/ Referenz/Aktuell/docs-update.html # _updates_with_a_partial_document – ymonad

+0

Dieses Dokument könnte besser sein: https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html#_using_scripts_to_make_partial_updates – ymonad

Antwort

1

Sie können eine Skript machen aktualisiert mit der update API:

curl -XPOST 'localhost:9200/test_index/doc/1/_update' -d '{ 
    "script" : { 
     "inline": "ctx._source.parent += ['name': name, 'label': label]", 
     "params" : { 
      "name" : "Pakistan", 
      "label": "PK" 
     } 
    } 
}' 

UPDATE

Wenn Sie dies in einer Bulk-Abfrage verwenden möchten, ist es

auch möglich ist,
curl -XPOST 'localhost:9200/test_index/doc/_bulk' -d ' 
{ "update" : { "_id" : "1"} } 
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}} 
' 
+0

Ist es möglich zu Verwenden Sie dies in großen Mengen API? Weil mein Index Millionen von Datensätzen enthält und einige tausend davon aktualisiert werden müssen! – shantanuo

+0

Ja, ich habe meine Antwort aktualisiert – Val

+0

Ich bekomme "Dokument fehlt Ausnahme", wenn die ID 1 nicht existiert. Ist es möglich, Dokument 1 mit dieser Aktualisierungsabfrage zu erstellen? – shantanuo

0

Wenn ich die Antwort von val hinzufüge, kann ich upsert verwenden, wenn das Dokument noch nicht existiert.

POST /test_index/doc/1/_update 
{ 
    "script": { 
     "inline": "ctx._source.parent += ['name': name, 'label': label]", 
     "params": { 
     "name": "Pakistan", 
     "label": "PK" 
     } 
    }, 
    "upsert": {"parent" : [{ 
     "name": "Pakistan", 
     "label": "PK" 
    }] 
    } 
} 

UPDATE

Bulk-API Upsert etwas wie folgt aussehen ...

POST /test_index/doc/_bulk 
{ "update" : { "_id" : "1"} } 
{ "script" : { "inline": "ctx._source.parent += ['name': name, 'label': label]", "lang" : "groovy", "params" : {"name" : "Pakistan", "label": "PK"}}, "upsert": {"parent" : [{"name": "Pakistan", "label": "PK" }] }}