2015-01-23 3 views
6

Ho bisogno di indicizzare/aggiornare un documento in Elasticsearch e attendere fino a quando non è ricercabile (l'aggiornamento è stato eseguito). C'è un problema correlato su Github: https://github.com/elasticsearch/elasticsearch/issues/1063elasticsearch "blocco fino all'aggiornamento"/"attendere che il doc sia ricercabile" alternative

Non imporrò l'aggiornamento perché influisce sulle prestazioni dell'indicizzazione e dovrò eseguire questa operazione molto spesso. Ho provato ad aspettare 1 secondo come descritto nel problema Github. Funziona molto bene finché Elasticsearch non è sotto pressione, ma quando non c'è molta RAM rimasta (cosa che potrebbe accadere occasionalmente) ho visto l'aggiornamento richiedere fino a 5 o 6 secondi. Così ho provato un altro modo.

Ho scritto una funzione di supporto nel mio backend che aspetta che il documento "ricercabile" raggiunga una determinata versione. E 'molto semplice:

- GET the document with realtime=false 
- if there is a result 
    - if result.version >= wanted.version. 
     Return 
    - else 
     wait a little more and retry 
- else if the doc is not found 
    - HEAD the document with realtime=true (test if the doc exists in the transaction log) 
     - if the doc is found (then it has just been created) 
      wait a little more and retry 
     - else 
      Return. (the doc might have been created and deleted really fast) 

La versione ricercato è la versione restituito da elasticsearch quando il documento è stato indicizzato.

Questo algoritmo funziona ma si vede che non è perfetto.

  • prima si farà più chiamate a elasticsearch quando è sotto pressione, che non è davvero una buona idea.

  • Ho visto la ricerca elastica ripristinare il numero di versione quando un documento è stato cancellato per qualche tempo. Se per qualche motivo la funzione manca, potremmo aspettare fino a quando il documento non avrà nuovamente raggiunto questa versione. (è per questo che ho anche aggiunto un timeout).

Qualcuno ha una soluzione migliore? Scalare automaticamente non è una risposta accettabile in questo momento.

risposta

2

Come detto Guillaume Massé, una soluzione sta per essere incorporata in elasticsearch https://github.com/elastic/elasticsearch/issues/1063#issuecomment-223368867

Così vorrei consigliare di aspettare per la funzionalità built-in piuttosto che l'implementazione di una soluzione personalizzata.

+0

Penso che valga la pena sottolineare che un effetto collaterale di Elasticsearch come open source e sviluppato apertamente è che solo perché qualcuno del team Elasticsearch propone pubblicamente una cosa non significa che la sua politica aziendale o addirittura una buona idea. Facciamo quasi tutte le proposte pubblicamente perché è così che dovrebbe funzionare l'open source. Hai avuto un'idea migliore e mi hai collegato al post StackOverflow su di esso, per esempio. – Nik

+0

Sì, sono completamente d'accordo. Quello che intendevo era semplicemente "nessuna soluzione migliore di cui abbia mai sentito parlare, per il momento". Non volevo dire "questo è il modo di usare Elasticsearch". Grazie per averlo indicato. Risolverò la risposta per renderla più chiara. – nharraud

+0

Sta per essere chiuso/risolto: https://github.com/elastic/elasticsearch/issues/1063#issuecomment-223368867 –