Integración del motor de búsqueda de texto completo Pagefind en un blog Next.js SSG
¿Qué es Pagefind?
Pagefind es un motor de búsqueda de texto completo desarrollado recientemente que se ejecuta en la web. La descripción oficial indica:
Pagefind es una librería de búsqueda completamente estática que busca funcionar bien en sitios grandes, utilizando el menor ancho de banda posible del usuario y sin necesidad de alojar ninguna infraestructura. Pagefind se ejecuta después de Hugo, Eleventy, Jekyll, Next, Astro, SvelteKit o cualquier otro framework web. El proceso de instalación es siempre el mismo: Pagefind solo requiere una carpeta que contenga los archivos estáticos construidos de tu sitio web, por lo que en la mayoría de los casos no se necesita configuración para empezar.
Como se puede ver en , está escrito en Rust (WebAssembly). El pipeline de stemming → indexación → búsqueda parece estar basado en WebAssembly.
Soporte para japonés
El soporte multilingüe está disponible. El soporte para japonés es limitado, pero aparentemente se aplica la segmentación del chino en lugar de la segmentación basada en espacios en blanco.
El idioma soportado se determina consultando el atributo lang del HTML.
Además, la segmentación durante la búsqueda no está soportada, por lo que la tokenización de palabras compuestas no ocurre en el momento de la búsqueda. Es necesario hacer la separación por espacios manualmente. Los detalles del stemming están escritos aquí, pero no estoy lo suficientemente familiarizado como para entender completamente los detalles. No parece usar diccionarios y parece estar basado en reglas.
Actualmente, al indexar, Pagefind no soporta stemming para idiomas especializados, pero sí soporta la segmentación de palabras no separadas por espacios en blanco. Pagefind aún no soporta la segmentación de la consulta de búsqueda, por lo que buscar en el navegador requiere que las palabras en la consulta estén separadas por espacios en blanco. En la práctica, esto significa que en una página etiquetada como idioma zh-, 每個月都 será indexado como las palabras 每個, 月 y 都. Al buscar en el navegador, buscar 每個, 月 o 都 individualmente funcionará. Además, buscar 每個 月 都 devolverá resultados que contengan cada palabra en cualquier orden, y buscar "每個 月 都" entre comillas coincidirá exactamente con 每個月都. Buscar 每個月都 devolverá cero resultados, ya que Pagefind no puede segmentarlo en palabras en el navegador. Se está trabajando para mejorar esto y se espera eliminar esta limitación en el futuro.
Algoritmo de búsqueda
No pude encontrar información sobre el algoritmo de búsqueda en la página oficial, pero leyendo el código, parece usar BM25 a fecha de (2024/09/23).
Implementación en Next.js
Esto asume SSG. Omitiré los detalles de configuración de Next.js, pero se requiere output: "export".
Configuración
Se utiliza npm-run-all como ejecutor de tareas.
En el CLI de pagefind, especifica el directorio out generado por next build con --site.
Esto genera el índice, pagefind.js, etc. bajo out/pagefind/ (a menos que se especifique --output-path).
Como referencia, aproximadamente se genera lo siguiente:
Details
Además, pagefind.js también necesita ser cargable en el entorno de desarrollo, por lo que durante el desarrollo lo generamos bajo public/pagefind.
Como no queremos esto en git, lo añadimos a .gitignore.
.gitignore
Escribiendo el componente
- Usa
useEffectpara importar dinámicamente/pagefind/pagefind.js.- Esta ruta debe coincidir con la ruta de salida especificada en el CLI de
pagefind.
- Esta ruta debe coincidir con la ruta de salida especificada en el CLI de
- Se usa Zod para la obtención de resultados con tipado seguro.
Para información de tipos, consulta lo siguiente. Solo usé las partes que parecían necesarias.
Especificando dónde indexar
Puedes controlar dónde ocurre la indexación especificando etiquetas data-pagefind-*.
El ejemplo más directo es especificar data-pagefind-body, lo que hace que solo se indexe el contenido dentro de main:
También puedes excluir secciones específicas de la indexación especificando data-pagefind-ignore.
Para más detalles, consulta:
Conclusión
Me impresionó lo fácil que fue añadir un motor de búsqueda a un sitio SSG. Esto hace que parezca posible alojar un blog en Cloudflare o servicios similares con todas las funcionalidades necesarias.