2016-01-03 4 views
16

Sto utilizzando lo Elasticsearch Bulk API per creare o aggiornare documenti.API di Elasticsearch Bulk - Indice vs Crea/Aggiorna

In realtà so se sono creati o aggiornati, ma posso semplificare il mio codice semplicemente facendoli tutti index o "upserts" nel senso SQL.

Esiste uno svantaggio nell'uso di index (e nel fatto che ES lo rileva) utilizzando il più esplicito create e update?

risposta

23

Se stai inviando create, è necessario assicurarsi che il documento non esiste ancora nell'indice altrimenti la chiamata avrà esito negativo, mentre l'invio lo stesso documento con index sarà sempre successo.

Quindi, se per motivi di prestazioni, sai che dovrai creare un documento (sia con create o index) e poi ti aggiorna solo pochi proprietà, quindi utilizzando update potrebbe avere senso.

Altrimenti, se invii sempre documenti completi, utilizzerei sempre lo index, sia per la creazione che per l'aggiornamento. Ogni volta che vede un'azione index, ES crea il documento se non esiste o lo sostituisce se esiste, ma la chiamata avrà sempre successo.

2

Non sarà possibile utilizzare l'indice per tutto. Secondo il docs:

indice

sarà aggiungere o sostituire un documento, se necessario

Inoltre, se si sta aggiornando un documento, potrebbe essere utile per aggiungere il flag 'doc_as_upsert'. Maggiori informazioni here e here

5

La risposta breve: No, non ci sono svantaggi.

Gli endpoint di creazione e aggiornamento sono casi speciali. Con create non vuoi fare nulla se il documento è già lì. Con l'aggiornamento è possibile fornire meno dati se non si dispone di tutti i dati del documento, è sufficiente aggiungere alcuni campi. Potresti anche assicurarti che il documento sia indicizzato solo nel caso in cui sia già presente con l'aggiornamento.

+0

Si supponga di poter potenzialmente sostituire un determinato documento molte, molte volte (ad esempio, indicizzando lo stesso identico documento molte volte). Dal momento che ES non "cancella" realmente nulla, non stai aggiungendo sempre più documenti e incrementando il loro numero di versione, lasciandolo successivamente al garbage collector per ripulire le versioni precedenti? In tal caso, non si sta utilizzando l'indice o creare andando a gonfiare il tuo indice a breve termine, che potrebbe influire sulle prestazioni? E il futuro utilizzo pesante della garbage collection non influenzerà anche le prestazioni? Questa è una domanda reale che mi sto chiedendo, non retorica. Grazie – cwarny

+0

Ma quando aggiorni un documento, non lo recupera, lo modifica e lo indicizza comunque? In Aggiornamento di un documento intero, abbiamo detto che il modo per aggiornare un documento è recuperarlo, modificarlo e quindi reindicizzare l'intero documento. Questo è vero. Tuttavia, utilizzando l'API di aggiornamento, possiamo eseguire aggiornamenti parziali come l'incremento di un contatore in una singola richiesta. Abbiamo anche detto che i documenti sono immutabili: non possono essere modificati, solo sostituiti. L'API di aggiornamento deve rispettare le stesse regole. –