Un buscador en el blog

Hace unos días publiqué una nota titulada Lo que ve una IA en el blog en la que reflexionaba sobre cómo una inteligencia artificial «lee» y navega por un blog como este. La conclusión fue simple: el blog necesita de un buscador.

A eso se sumó un toot de @[email protected] donde se “unía” a la petición de la IA por qué no tenía ninguna forma de buscar dentro del sitio. 

Este blog es intencionadamente austero. Sin comentarios, sin rastreadores (bueno, Umami, pero respetuoso con la privacidad). Solo HTML, CSS y muy poco más. Llevo tiempo intentando mantener el blog lo más ligero posible, y meter JavaScript para el buscador me parecía ir en contra de esa filosofía.

La primera opción que consideré fue un formulario simple que redirige a DuckDuckGo con site:elblogdelazaro.org. Cero JavaScript, cero dependencias. Pero los resultados dependen de que DuckDuckGo haya indexado bien el sitio, y el usuario acaba saliendo del blog para ver los resultados. No era lo ideal.

Pagefind es diferente y algunas razones por las que me convenció fueron:

  • Es un binario externo. Se ejecuta después de hugo, apunta a la carpeta public/ y genera su propio índice  estático. No toca el proceso de construcción del sitio.
  • El bundle es pequeño. Ronda los 2-3 KB comprimidos. Nada que ver con Lunr.js o Fuse.js con un `index.json` de cientos de  kilobytes.
  • El índice está en mi servidor. No hay llamadas externas, no hay API de terceros. El índice se genera a partir de tu public/ y se sirve desde el mismo sitio.

El JavaScript solo se carga en la página de búsqueda, cuando el usuario lo ha pedido. 

La página de búsqueda está en /pages/search/ y está enlazada en el menú principal. El buscador indexa artículos, notas y páginas, y muestra resultados con fragmentos del contenido.

El flujo ahora es:

hugo --gc --minify && ./pagefind --site public

Y listo. El índice se regenera en cada despliegue junto con el resto del sitio.

Si encuentras algo raro o tienes sugerencias, ya sabes dónde encontrarme.