2016-07-31 5 views
1

Ich versuche gerade, ein Dokument zu erstellen oder zu ersetzen, aber die API-Dokumentation ist nicht klar, wie dies zu tun ist.Wie erstelle oder ersetze ich ein Dokument in Elasticsearch?

Das upsert Beispiel zeigt ein Dokument mit einem counter Wert von 1 erstellt werden:

client.update({ 
    index: 'myindex', 
    type: 'mytype', 
    id: '777', 
    body: { 
     script: 'ctx._source.counter += 1', 
     upsert: { 
      counter: 1 
     } 
    } 
}, function(error, response) { 
    // ... 
}) 

Ich habe nicht die Erhöhung Skript benötigen, also versuche ich, nur eine Upsert selbst zu senden, aber ich bekomme eine 400 Validation Failed: 1: script or doc is missing:

client.update({ 
    index: "testindex", 
    type: "testType", 
    id: 1234, 
    body: { 
     upsert: { 
      itworks: true, 
      ok: "oh yeah" 
     } 
    } 
}) 

Nun, lassen Sie uns versuchen, etwas albern und schließen die doc zweimal; einmal unter doc, die vermutlich ein vorhandenes Dokument ersetzen würde, wenn es eine war, und einmal unter upsert, die verwendet werden würde sonst ein neues Dokument zu erstellen:

client.update({ 
    index: "testindex", 
    type: "testType", 
    id: 1234, 
    body: { 
     upsert: { 
      itworks: true, 
      ok: "oh yeah" 
     }, 
     doc: { 
      itworks: true, 
      ok: "oh yeah" 
     } 
    } 
}) 

, die tatsächlich funktioniert, 201 Erstellt. 200 OK, wenn ich es wiederholen Sie den doc mit einem anderen zu ersetzen:

client.update({ 
    index: "testindex", 
    type: "testType", 
    id: 1234, 
    body: { 
     upsert: { 
      whatever: "man" 
     }, 
     doc: { 
      whatever: "man" 
     } 
    } 
}) 

Aber wenn ich die doc (client.get({index: "testindex", type: "testType", id: 1234})) überprüfen, wie ich sehe, dass stattdessen die vorhandene doc zu ersetzen, die neue doc mit ihm verschmolzen wurde.

Wie ersetzen Sie einfach ein Dokument in Elasticsearch, mit dem Standard-Knoten-Client? Die HTTP-API lässt es aussehen so simple, aber ich habe eine Reihe von Permutationen davon im Knoten-Client ohne Erfolg versucht. Gibt es keinen Ersetzungsbefehl? Muss ich löschen und dann erstellen?

Antwort

3

In Elasticsearch, um ein Dokument zu ersetzen, müssen Sie einfach ein Dokument mit der gleichen ID indizieren und es wird automatisch ersetzt.

Wenn Sie ein Dokument aktualisieren möchten, können Sie entweder ein Skriptupdate, ein Teilupdate oder beides durchführen.

eine teilweise doc Update einfach zu tun Sie

Teil Dokument Update:

client.update({ 
    index: 'myindex', 
    type: 'mytype', 
    id: '1', 
    body: { 
    // put the partial document under the `doc` key 
    doc: { 
     title: 'Updated' 
    } 
    } 
}, function (error, response) { 
    // ... 
}) 

Scripted Update:

client.update({ 
    index: 'myindex', 
    type: 'mytype', 
    id: '1', 
    body: { 
    script: 'ctx._source.tags += tag', 
    params: { tag: 'some new tag' } 
    } 
}, function (error, response) { 
    // ... 
}); 

Mehr Infos in Elasticsearch JS documentation

+0

Ein 'create' Aufruf mit der gleichen ID gibt einen 409 Konflikt zurück: Dokument existiert, oder ein Versionskonflikt, wenn ich eine Version einschließe, die nicht mit der bestehenden Version übereinstimmt. –

+2

probiere 'index' statt' create' –

+0

Das war's! Ich hätte den Begriff nie erraten. Ich habe über Indizes nachgedacht, wie sie in einem RDBMS verwendet werden, wo sie meistens nur eine Optimierung sind. –

1

Dies ist einer der Die Gründe, warum ich immer Index anstelle von erstellen: