2013-11-04 13 views
6

Sto scrivendo alcuni test di integrazione per un'app che utilizza Elasticsearch e sto riscontrando uno strano comportamento. Se inserisco un documento e interrogo subito dopo, ottengo risultati diversi ogni volta. Ho il sospetto che, sebbene l'inserimento stesso ritorni, l'indicizzazione stessa non avvenga in modo sincrono e, a causa di ciò, la query sperimenterà una condizione di competizione con risultati imprevedibili.Elasticsearch comportamento strano per le query subito dopo l'inserimento

Se questo è il caso: c'è un modo per sincronizzarsi, in modo che quando eseguo le mie query, so che sono pronti e di successo ???

Ulteriori dettagli: Sto usando elasticsearch embedded e la query è un semplice filtro. L'unica cosa strana è che sto usando file modello per il modello di documento.

EDIT: Ho anche provato a OTTENERE il documento per ID dopo l'inserimento, ma le query restituiscono ancora risultati casuali (a meno che non inserisca un thread in attesa di attendere qualche secondo).

+0

suppongo che si sta utilizzando l'API Java. questo potrebbe aiutare: http://stackoverflow.com/questions/10766562/async-nature-of-elasticsearch-java-api – phoet

+0

No, è l'api REST, tuttavia ho trovato il motivo – gotch4

+0

Non credo che si possa menzionare ragione, @ gotch4 - Penso che stiamo avendo lo stesso problema. – Bryan

risposta

10

Dal Elasticsearch docs for the index API:

aggiornamento

Per aggiornare l'indice subito dopo si verifica il funzionamento, in modo che il documento appare nei risultati di ricerca immediatamente, il parametro di aggiornamento può essere impostato su true. L'impostazione di questa opzione su true dovrebbe essere eseguita SOLO dopo un'attenta analisi e verifica del fatto che non porta a prestazioni scadenti , sia da un punto di vista di indicizzazione che di ricerca. Nota: ottenere un documento usando l'API get è completamente in tempo reale.

Ecco perché le mie query hanno restituito risultati strani. Perché l'indicizzazione a volte non è stata ancora completata. Inoltre, è possibile fare un aggiornamento non come parte di un inserimento, using the _refresh endpoint:

$ curl -XPOST 'http://localhost:9200/twitter/_refresh'