2015-01-15 16 views
5

In particolare, sto utilizzando Elasticsearch per eseguire l'impaginazione, ma questa domanda potrebbe essere applicata a qualsiasi database.Come gestire l'impaginazione quando i dati di origine cambiano di frequente

Elasticsearch fornisce metodi a paginate search results con i pratici parametri from e to.

Così ho esegue una query get me the most recent data from result 1 to 10

Questa grande opera.

L'utente clicca su "pagina successiva" e la query è: get me the most recent data from result 11 to 20

Il problema è che nel tempo tra i due interrogazioni, sono stati aggiunti 2 nuovi record al database di supporto, il che significa che i risultati impaginati si sovrapporrà (gli ultimi 2 della prima pagina appariranno come primi due nella seconda pagina).

Qual è la soluzione migliore per evitare questo? In questo momento sto aggiungendo un filtro alla query che dice di includere solo i risultati più tardi rispetto all'ultimo risultato della query precedente. Ma sembra semplicemente hackish.

risposta

5

Un filtro non è una cattiva opzione, se stai già indicizzando un timestamp rilevante. È necessario tenere traccia di tale timestamp sul lato client per preparare correttamente le query. Devi anche sapere quando sbarazzartene. Ma quelli non sono problemi insormontabili.

L'API di scorrimento è un'opzione solida per questo, perché effettivamente scatta istantaneamente nel lato Elasticsearch. L'intento dell'API Scroll è di fornire una query di ricerca stabile per l'impaginazione profonda, che deve affrontare il problema esatto delle modifiche che stai riscontrando.

Si inizia un Scrolling Search fornendo la query e il parametro scroll, per il quale Elasticsearch restituisce un scroll_id. Quindi si effettua la richiesta a /_search/scroll fornendo quell'ID, ognuno dei quali restituisce una pagina di risultati e un nuovo scroll_id per la richiesta successiva.

(Si noti che è non si voglio scrivere qui la ricerca scan. Che viene utilizzato per estrarre i documenti in massa, e non si applica alcun ordinamento.)

Rispetto al filtraggio, avete ancora per tracciare un valore: lo scroll_id per la tua prossima pagina di risultati. Se è più facile che tracciare un timestamp dipende dalla tua app.

Ci sono altri potenziali aspetti negativi da considerare. Elasticsearch persiste il contesto per la ricerca su un singolo nodo all'interno del cluster. È plausibile che questi possano accumularsi nel cluster, a seconda di quanto fortemente si basa sulla ricerca a scorrimento. Ti consigliamo di testare le implicazioni sulle prestazioni lì. E se ricordo correttamente, anche le ricerche a scorrimento non persistono attraverso un errore o un riavvio del nodo.

La documentazione ES per il Scroll API fornisce buoni dettagli su tutto quanto sopra.

Bottom line: il filtro per data/ora non è una scelta sbagliata. L'API di scorrimento è un'altra opzione valida, progettata per un caso d'uso simile, ma non privo di inconvenienti.

+0

Grazie per la spiegazione dettagliata. Per qualche ragione, pensavo che scan/scroll fosse la stessa cosa, ma ovviamente non è vero! Scroll sembra una buona scelta quando non hai qualcosa come l'ultimo timestamp da filtrare. – bradvido

+0

Lo svantaggio per il filtro data/ora è che se qualcuno dovesse cancellare un documento, si potrebbe potenzialmente saltare un documento dalla pagina successiva dei risultati? – writofmandamus

+0

Nota dai documenti API Scroll 'Lo scorrimento non è inteso per richieste utente in tempo reale,' – Ben

-1

È necessario utilizzare l'API di scansione per questo. Scansione e scorrimento dell'API facciamo la ricerca e l'impaginazione puntuale. API di scansione -

+1

L'utilizzo dell'API di scansione potrebbe non essere la cosa giusta da fare qui. Non applica l'ordinamento sui risultati. – bittusarkar

Problemi correlati