Necesita emplear muchas técnicas para lograr esto con éxito.
Primero, necesita algún tipo de capa de persistencia. Si está utilizando un sitio web simple antiguo, entonces la sesión del usuario sería la capa más lógica para usar. Si está utilizando servicios web (es decir, sin sesión) y simplemente realiza llamadas a través de un cliente, entonces aún necesita algún tipo de capa de aplicación (una especie de sesión compartida) para sus servicios. ¿Por qué? Esta capa albergará tu caché de resultados de base de datos.
En segundo lugar,, necesita una forma de almacenar los resultados en caché en cualquier contenedor que esté utilizando (sesión o capa de aplicación de servicios web). Puede hacerlo de varias maneras ... Si la consulta es algo que cualquier usuario puede hacer, un simple hash de la consulta funcionará y podrá compartir este resultado almacenado entre otros usuarios. Probablemente todavía desee algún tipo de GUID para el resultado, de modo que pueda pasar esto en su aplicación cliente, pero será útil tener una búsqueda hash de las consultas a los resultados. Si estas consultas son únicas, puede usar el GUID exclusivo para el resultado de la consulta y pasarlo a la aplicación cliente. Esto es para que pueda realizar su función de almacenamiento en caché ...
El mecanismo de almacenamiento en caché puede incorporar algún tipo de búfer de longitud fija o cola ... para que los resultados antiguos se eliminen automáticamente a medida que se agreguen nuevos. Entonces, si aparece una consulta que es una falta de caché, se ejecutará normalmente y se agregará a la memoria caché.
Tercer, se le va a querer alguna manera a la página de su objeto de resultado ... el iterador funciona bien aquí, aunque probablemente algo más simple podría funcionar ... como buscar a X cantidad de resultados comenzando en el punto Y. Sin embargo, el patrón Iterator sería mejor, ya que podría eliminar el mecanismo de almacenamiento en caché más adelante y la página directamente desde la base de datos, si así lo desea.
Cuarto,, necesita algún tipo de mecanismo de precarga (como se sugirió). Debería iniciar un hilo que hará la búsqueda completa, y en su hilo principal solo haga una búsqueda rápida con el número X superior de artículos. Esperemos que para cuando el usuario intente buscar, el segundo subproceso estará terminado y su resultado completo ahora estará en la memoria caché. Si el resultado no está listo, puede incorporar una lógica de pantalla de carga simple.
Esto debería ayudarte un poco ... házmelo saber si quieres aclaración/más detalles sobre cualquier pieza en particular.
Te dejo con algunos consejos más ...
Usted no quiere estar enviando todo el resultado a la aplicación de cliente (si está usando Ajax o algo así como una aplicación para el iPhone). ¿Por qué? Bueno, porque eso es una gran pérdida. Es probable que el usuario no vaya a buscar todos los resultados ... ahora simplemente envió más de 2MB de campos de resultados para nada.
Javascript es un lenguaje impresionante, pero recuerde que sigue siendo un lenguaje de scripting del lado del cliente ... no desea retrasar demasiado la experiencia del usuario enviando grandes cantidades de datos para que su cliente Ajax maneje. Simplemente envíe el resultado obtenido previamente a su cliente y los resultados de página adicionales como las páginas del usuario.
Abstraction abstraction abstraction ... desea abstraer la caché, la consulta, la búsqueda, la obtención previa ... tanto como pueda. ¿Por qué? Bueno, digamos que desea cambiar las bases de datos o desea crear una página directamente desde la base de datos en lugar de usar un objeto de resultado en la memoria caché ... bueno, si lo hace bien, es mucho más fácil cambiarlo más adelante. Además, si utiliza servicios web, muchas otras aplicaciones pueden hacer uso de esta lógica más adelante.
Ahora, probablemente sugerí una solución sobre-diseñada para lo que necesita :). Pero, si puede lograr esto utilizando todas las técnicas correctas, aprenderá muchísimo y tendrá una muy buena base en caso de que desee extender la funcionalidad o reutilizar este código.
Avíseme si tiene alguna pregunta.
¿Has mirado Apache SOLR? –