Indexa aquí, indexa allá, y búscame, y búscame

Este blog no siempre tuvo un buscador. Bueno, había una caja de texto con una lupa que no llevaba a ningún lado. La intención estaba, pero los detalles de implementación eran delicados.

Seguro que estarás pensando que no es nada difícil buscar en SQL, añadiendo unos porcentajes... Eso está bien para una tienda cutre en PHP, muchacho/a.

Sin embargo, tenemos Lucene. Ay, Lucene...

Apache Lucene es una herramienta opensource de Apache para la indexación y búsqueda, con capacidades de análisis, radicación y tokenización de texto en varios idiomas, y con un montonazo de plugins. Básicamente, hace lo mismo que Google cuando indexa el contenido de las webs que visita su bot, solo que con diferente tecnología.

Utilizar la base de datos para realizar una búsqueda textual, aunque posible, es matar moscas a cañonazos. Y tiene un gran problema: no es escalable, principalmente por dos motivos.

  • El coste de búsqueda aumenta linealmente con el número de elementos sobre los que se busca.
  • Esta forma de ejecutar SQL inhibe toda caché posible.

En el fondo, y aunque PostgreSQL incorpore librerías de indexación de texto, una base de datos relacional no está diseñada para ese propósito...

Esta buena gente de Lucene, que se enorgullece de su rendimiento, dispone de una web con diversos benchmarks. En este enlace concreto, se puede ver el rendimiento de la forma de búsqueda más simple. En resumen, unas 30 consultas por segundo... en el total del texto de la Wikipedia inglesa.

Por supuesto, también tiene sus contras, pero eso será en una próxima entrada...

Ahora que lo menciono, los sitios de Wikimedia, incluida la Wikipedia, utilizan Lucene como motor de indexación y búsqueda.