2013-04-12 8 views
5

Das Beispiel für Upsert existiert ist:Elasticsearch Update API, wenn ein Feld nicht

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "ctx._source.counter += count", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 

, die funktioniert, wenn das Dokument nicht vorher existiert.

Angenommen, ich möchte ein Feld aktualisieren, das nicht unbedingt existiert, aber das Dokument existiert. Zum Beispiel hat das Dokument möglicherweise noch kein Zählerfeld.

Wie gehe ich dabei vor?

Antwort

9

können Sie den Update-Skript verwenden, um zu überprüfen, ob Feld vorhanden ist:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "if(ctx._source.containsKey(\"counter\")){ ctx._source.counter += count; } else { ctx._source.counter = 1; }", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 
+0

Großartig! Weißt du zufällig, ob es eine Website gibt, die die MVEL-Sprache erklären könnte? Ich habe mein Bestes versucht, um es zu lernen, kann aber keine anständige Ressource finden. http://mvel.codehaus.org/Language+Guide+for+2.0 ist schrecklich und deckt fast nichts – eran

+1

Das ist die beste Ressource, die mir bekannt ist. Mein Rat wäre, [Javascript Plugin] (https://github.com/elasticsearch/elasticsearch-lang-javascript) zu installieren und zu Javascript als Ihre Skriptsprache wechseln. – imotov

+0

Aus elasticsearch Dokumentation über Skriptsprache: 'Das Skript-Modul verwendet standardmäßig groovy (zuvor mvel in 1.3.x und früher)' –

0

Die einfachste Form der Aktualisierungsanforderung einen Teil Dokument als akzeptiert die doc Parameter, die nur bekommen mit dem fusionierten bestehenden Dokument. Objekte werden zusammengeführt, vorhandene Skalarfelder werden überschrieben, und neue Felder hinzugefügt. Siehe Partial Updates to Documents

Zum Beispiel

(1) Erstellen Sie ein neues Dokument mit nur einem Feld field1

curl -XPOST localhost:9200/myidx/mytp/myid?pretty -d '{ 
    "field1" : 1 
}' 

Ihr Dokument ist,

"_source" : { 
    "field1" : 1 
} 

(2) Teilupdate a nicht -existing Feld, field2

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 2 
    } 
}' 

Ihr Dokument ist,

"_source" : { 
    "field1" : 1, 
    "field2" : 2 
} 

(3) Natürlich können Sie aktualisieren Sie vorhandene und nicht vorhandene Felder simutaneously

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 200, 
     "field3" : 3 
    } 
}' 

Ihre Dokument ist,

"_source" : { 
    "field1" : 1, 
    "field2" : 200, 
    "field3" : 3 
} 
Verwandte Themen