È necessario impiegare molte tecniche per rimuoverlo correttamente.
Primo, è necessario un qualche tipo di livello di persistenza. Se si sta utilizzando un semplice sito Web vecchio, la sessione dell'utente sarebbe il livello più logico da utilizzare. Se si utilizzano servizi Web (ovvero senza sessioni) e si effettuano chiamate attraverso un client, è necessario disporre di una sorta di livello applicazione (una sorta di sessione condivisa) per i propri servizi. Perché? Questo strato ospiterà la cache dei risultati del database.
Secondo, è necessario un metodo di memorizzazione nella cache dei risultati in qualsiasi contenitore utilizzato (sessione o livello di applicazione dei servizi Web). Puoi farlo in due modi ... Se la query è qualcosa che qualsiasi utente può fare, allora funzionerà un semplice hash della query, e potrai condividere questo risultato memorizzato tra gli altri utenti. Probabilmente vorresti ancora una sorta di GUID per il risultato, in modo che tu possa passarlo nella tua applicazione client, ma avere una ricerca hash dalle query ai risultati sarà utile. Se queste query sono univoche, è sufficiente utilizzare il GUID univoco per il risultato della query e inoltrarlo all'applicazione client. In questo modo è possibile eseguire la funzionalità di memorizzazione nella cache ...
Il meccanismo di memorizzazione nella cache può incorporare una sorta di buffer o coda di lunghezza fissa ... in modo che i vecchi risultati vengano automaticamente eliminati/rimossi man mano che ne vengono aggiunti di nuovi. Quindi, se arriva una query che è un errore di cache, verrà eseguita normalmente e aggiunta alla cache.
Terzo, si sta andando a voler in qualche modo alla pagina l'oggetto risultato ... il pattern Iterator funziona bene qui, anche se probabilmente qualcosa di più semplice potrebbe funzionare ... come recuperare X quantità di risultati a partire dal punto di Y. Tuttavia, il pattern Iterator potrebbe essere migliore, in quanto è possibile rimuovere successivamente il meccanismo di memorizzazione nella cache e la pagina direttamente dal database, se lo si desidera.
Quarto, è necessaria una sorta di meccanismo di pre-recupero (come suggerito da altri). Dovresti avviare una discussione che eseguirà la ricerca completa e nella tua discussione principale esegui una rapida ricerca con il numero X numero di articoli. Si spera che quando l'utente tenta il paging, il secondo thread sarà terminato e il risultato completo sarà ora nella cache. Se il risultato non è pronto, puoi semplicemente incorporare una semplice logica di caricamento dello schermo.
Questo dovrebbe farti un po 'di strada ... fammi sapere se vuoi chiarimenti/maggiori dettagli su una particolare parte.
Ti lascio qualche altro suggerimento ...
Non si vuole essere l'invio l'intero risultato al app cliente (se si utilizza Ajax o qualcosa come un iPhone app). Perché? Bene perché questo è un enorme spreco. L'utente probabilmente non sta andando a pagina attraverso tutti i risultati ... ora hai appena inviato oltre 2 MB di campi risultato per niente.
Javascript è un linguaggio fantastico, ma ricorda che è ancora un linguaggio di scripting lato client ... non vuoi rallentare troppo l'esperienza utente inviando enormi quantità di dati per il tuo client Ajax da gestire. Basta inviare il risultato prefetch al client e ai risultati aggiuntivi della pagina come pagine utente.
Astrazione di astrazione astrazione ... si desidera astrarre la cache, l'interrogazione, il paging, il prefetching ... il più possibile. Perché? Bene, diciamo che vuoi cambiare database o vuoi fare una pagina direttamente dal database invece di usare un oggetto risultato nella cache ... beh, se lo fai bene, è molto più facile cambiare in seguito. Inoltre, se si utilizzano i servizi Web, molte altre applicazioni possono utilizzare questa logica in seguito.
Ora, probabilmente ho suggerito una soluzione ingegnerizzata per quello che ti serve :). Ma se riesci a farcela usando tutte le tecniche giuste, imparerai una tonnellata e avrai un'ottima base nel caso tu voglia estendere la funzionalità o riutilizzare questo codice.
Fatemi sapere se avete domande.
Hai guardato Apache SOLR? –