2013-04-12 20 views
5

L'esempio per upsert è:elasticsearch Aggiorna API se un campo non esiste

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

che funziona se il documento non esiste in precedenza.

Dire che voglio aggiornare un campo che non esiste necessariamente, ma il documento esiste. Ad esempio, il documento potrebbe non avere ancora un campo contatore.

Come faccio a farlo?

risposta

9

È possibile utilizzare lo script di aggiornamento per verificare se il campo esiste:

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

Ottimo! Ti capita di sapere se c'è qualche sito che potrebbe effettivamente spiegare il linguaggio MVEL? Ho fatto del mio meglio per impararlo, ma non riesco a trovare alcuna risorsa decente. http://mvel.codehaus.org/Language+Guide+for+2.0 è orribile e copre quasi nulla – eran

+1

Questa è la migliore risorsa di cui sono a conoscenza. Il mio consiglio è di installare [javascript plugin] (https://github.com/elasticsearch/elasticsearch-lang-javascript) e passare a javascript come linguaggio di scripting. – imotov

+0

Dalla documentazione di elasticsearch sul linguaggio di scripting: 'Il modulo di scripting usa di default groovy (precedentemente mvel in 1.3.x e precedenti)' –

0

La forma più semplice della richiesta di aggiornamento accetta un documento parziale il parametro doc, che ottiene appena fusa con l'esistente documento. Gli oggetti vengono uniti insieme, i campi scalari esistenti vengono sovrascritti, e vengono aggiunti nuovi campi. Vedere Partial Updates to Documents

Per esempio,

(1) Creare un nuovo documento, con un solo campo field1

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

Il documento è,

"_source" : { 
    "field1" : 1 
} 

(2) Aggiornamento parziale a non campo -existing, field2

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

Il documento è,

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

(3) Naturalmente, è possibile aggiornare i campi esistenti e non esistenti simutaneously

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

tuo documento è,

"_source" : { 
    "field1" : 1, 
    "field2" : 200, 
    "field3" : 3 
} 
Problemi correlati