[Nom de la Configuration d'Indexation Pagefind]
[Nom de la Configuration d'Indexation Pagefind]
Documentation technique
Type de ressource : Configuration Indexation Pagefind (Règles / Exclusions / Métadonnées)
Fichier source :astro.config.mjsoupagefind.yml
Statut : [Actif / Déprécié / En développement]
1. Vue d’ensemble
1.1. Description
[Description concise du rôle de cette configuration d’indexation dans l’architecture du site]
1.2. Objectif
- [Objectif principal : ex. indexer uniquement les pages publiées du blog et de la documentation]
- [Bénéfice pour l’utilisateur final : ex. recherche rapide et pertinente]
1.3. Périmètre concerné
- Sources de contenu : [Sanity (SSG) / Starlight / Les deux]
- Type d’indexation : [Statique au build / Dynamique / Les deux]
- Langues supportées : [fr / en / multi-langue]
- Couverture : [Vitrine / Blog / Portfolio / Documentation / Tout]
2. Architecture et flux
2.1. Diagramme de flux
[Build Astro (SSG)] │ • Génération HTML statique │ • Pages Sanity + Starlight ▼[Pagefind CLI / astro-pagefind] │ • Lecture du dossier dist/ │ • Application des règles d'exclusion │ • Extraction du contenu texte │ • Génération de l'index chunké ▼[Dossier _pagefind/] │ • Index fragmenté (chunks) │ • Métadonnées et filtres ▼[Site déployé] │ • Index chargé à la demande │ • Recherche côté client ▼[Utilisateur final]2.2. Composants impliqués
| Composant | Rôle | Couche |
|---|---|---|
| Astro (SSG) | Génération des pages HTML | L2 |
| Pagefind CLI | Indexation statique | Build time |
| astro-pagefind | Intégration Astro | L2 |
| Starlight | Documentation indexée | L2 |
| Index Pagefind | Stockage de l’index | Build artifact |
| UI de recherche | Interface utilisateur | L2 |
3. Configuration de l’indexation
3.1. Configuration dans astro.config.mjs
import pagefind from 'astro-pagefind';
export default defineConfig({ integrations: [ pagefind({ ranking: { pageLength: 0.1, termFrequency: 0.5, termSaturation: 0.5, termSimilarity: 0.9, }, excludeSelectors: [ 'nav', 'footer', '.no-index', '.search-exclude', 'script', 'style', ], }), ],});3.2. Configuration alternative : pagefind.yml
# pagefind.yml (à la racine du projet)site: distexclude_selectors: - nav - footer - .no-index - .search-exclude - script - styleinclude_patterns: - '**/*.html'exclude_patterns: - '**/api/**' - '**/preview/**' - '**/404.html' - '**/500.html'ranking: pageLength: 0.1 termFrequency: 0.5 termSaturation: 0.5 termSimilarity: 0.93.3. Commandes npm
{ "scripts": { "build": "astro build && pagefind --source dist", "build:search": "pagefind --source dist", "dev": "astro dev" }}4. Règles d’inclusion et d’exclusion
4.1. Pages incluses
| Type de page | Source | Inclusion | Rationale |
|---|---|---|---|
| Pages vitrine | Sanity (SSG) | ✅ | Contenu public |
| Articles de blog | Sanity (SSG) | ✅ | Contenu public |
| Projets portfolio | Sanity (SSG) | ✅ | Contenu public |
| Documentation | Starlight | ✅ | Contenu technique |
| Pages d’accueil | Sanity (SSG) | ✅ | Contenu public |
4.2. Pages exclues
| Type de page | Raison d’exclusion | Méthode |
|---|---|---|
Pages API (/api/*) |
Routes techniques | Pattern **/api/** |
| Pages Preview | Contenu draft | Cookie/header detection |
| Pages d’erreur (404, 500) | Non pertinentes | Pattern **/404.html |
| Routes administratives | Accès restreint | Pattern **/admin/** |
| Pages de formulaire (GET) | Pas de contenu indexable | Classe .no-index |
| Éléments de navigation | Bruit dans les résultats | Sélecteur nav |
| Footer | Bruit dans les résultats | Sélecteur footer |
4.3. Exclusion via attributs HTML
<!-- Exclure un élément spécifique de l'indexation --><div data-pagefind-ignore="all"> <!-- Contenu non indexé --></div>
<!-- Exclure uniquement le contenu texte (conserver les liens) --><div data-pagefind-ignore="content"> <!-- Texte non indexé, mais liens indexés --></div>
<!-- Exclure via classe CSS --><div class="no-index"> <!-- Contenu non indexé --></div>5. Métadonnées et filtres
5.1. Métadonnées Pagefind
---title: "Titre de la page"description: "Description de la page"# Métadonnées Pagefind spécifiquespagefind: weight: title: 2.0 # Poids du titre dans le ranking content: 1.0 # Poids du contenu meta: type: "blog" # Type de contenu (pour filtrage) category: "tech" # Catégorie (pour filtrage) author: "John Doe" # Auteur (pour filtrage) filters: - type: blog - category: tech - author: john-doe exclude: selectors: - ".sidebar" - ".related-posts"---5.2. Métadonnées via attributs HTML
<!-- Définir des métadonnées Pagefind --><article data-pagefind-meta="type:blog,category:tech,author:john-doe"> <h1 data-pagefind-weight="2.0">Titre de l'article</h1> <div data-pagefind-body> <!-- Contenu principal --> </div></article>5.3. Filtres disponibles
| Filtre | Type | Exemple de valeurs | Usage |
|---|---|---|---|
type |
String | blog, portfolio, docs, page |
Distinction visuelle des résultats |
category |
String | tech, design, marketing |
Filtrage par catégorie |
author |
String | john-doe, jane-smith |
Filtrage par auteur |
language |
String | fr, en |
Filtrage par langue (i18n) |
date |
Date | 2026-09-03 |
Tri chronologique |
6. Intégration avec Starlight
6.1. Configuration Starlight
import starlight from '@astrojs/starlight';
export default defineConfig({ integrations: [ starlight({ title: 'Documentation Technique', // Starlight utilise Pagefind nativement // L'index est partagé avec le reste du site }), ],});6.2. Cohérence des index
- ✅ Starlight et le site principal partagent le même index Pagefind
- ✅ Les pages de documentation sont indexées avec les mêmes règles
- ✅ Les filtres permettent de distinguer les résultats (badge “Doc”)
- ✅ L’expérience de recherche est homogène sur tout le site
6.3. Métadonnées Starlight
---title: "Guide d'installation"description: "Comment installer et configurer le projet"sidebar: label: "Installation" order: 1# Métadonnées Pagefind pour Starlightpagefind: meta: type: "docs" category: "guide" filters: - type: docs - category: guide---7. Stratégie de ranking
7.1. Paramètres de ranking
| Paramètre | Valeur | Description |
|---|---|---|
pageLength |
0.1 | Pénalité pour les pages trop longues |
termFrequency |
0.5 | Importance de la fréquence des termes |
termSaturation |
0.5 | Saturation de la fréquence des termes |
termSimilarity |
0.9 | Tolérance aux fautes de frappe |
7.2. Pondération des éléments
| Élément | Poids | Rationale |
|---|---|---|
Titre (<h1>) |
2.0 | Plus important que le contenu |
Sous-titres (<h2>, <h3>) |
1.5 | Importance intermédiaire |
| Contenu principal | 1.0 | Poids standard |
| Métadonnées (title, description) | 1.5 | Importance élevée |
| Liens et navigation | 0.5 | Poids réduit |
7.3. Personnalisation du ranking
<!-- Augmenter le poids d'un titre spécifique --><h1 data-pagefind-weight="3.0">Titre très important</h1>
<!-- Réduire le poids d'une section --><section data-pagefind-weight="0.5"> <!-- Contenu moins important --></section>8. Performance et optimisation
8.1. Taille de l’index
| Métrique | Objectif | Stratégie |
|---|---|---|
| Taille totale | < 5 MB | Exclusion des éléments non pertinents |
| Temps d’indexation | < 30s | Optimisation des règles d’exclusion |
| Temps de chargement | < 500ms | Index chunké (lazy loading) |
| Mémoire client | < 50 MB | Pagination des résultats |
8.2. Optimisation de l’index
- ✅ Exclure les éléments de navigation et footer (réduit le bruit)
- ✅ Utiliser des sélecteurs CSS précis pour exclure du contenu
- ✅ Limiter les métadonnées aux filtres réellement utilisés
- ✅ Optimiser les images avant le build (réduit la taille HTML)
- ✅ Utiliser
data-pagefind-bodypour identifier le contenu principal
8.3. Index chunké
Pagefind génère un index fragmenté (chunks) qui est chargé à la demande :
_pagefind/├── pagefind.js # Script principal├── pagefind-ui.css # Styles UI (optionnel)├── fragment/│ ├── pagefind.pf_1 # Chunk 1│ ├── pagefind.pf_2 # Chunk 2│ └── ...└── metadata/ └── pagefind.pf_meta # Métadonnées9. Intégration avec l’UI de recherche
9.1. Composant de recherche
---import { Search } from 'pagefind-ui';---
<div id="search"></div>
<script> import { Search } from 'pagefind-ui';
new Search({ element: '#search', pageSize: 10, showSubResults: true, showImages: false, processResult: (result) => { // Personnalisation des résultats return { ...result, badge: result.meta.type === 'docs' ? 'Doc' : result.meta.type === 'blog' ? 'Blog' : result.meta.type === 'portfolio' ? 'Portfolio' : 'Page', }; }, });</script>9.2. Distinction visuelle des résultats
| Type de contenu | Badge | Couleur |
|---|---|---|
| Documentation | “Doc” | Bleu |
| Article de blog | “Blog” | Vert |
| Projet portfolio | “Portfolio” | Orange |
| Page vitrine | “Page” | Gris |
9.3. Filtrage par type
<div class="search-filters"> <label> <input type="checkbox" value="docs" checked /> Documentation </label> <label> <input type="checkbox" value="blog" checked /> Blog </label> <label> <input type="checkbox" value="portfolio" checked /> Portfolio </label> <label> <input type="checkbox" value="page" checked /> Pages </label></div>10. Débogage et troubleshooting
10.1. Problèmes courants
| Symptôme | Cause probable | Solution |
|---|---|---|
| Page non trouvée dans les résultats | Page exclue ou non publiée | Vérifier les règles d’exclusion et le statut |
| Résultats non pertinents | Ranking mal configuré | Ajuster les poids et les métadonnées |
| Index trop volumineux | Trop de contenu indexé | Exclure les éléments non pertinents |
| Recherche lente | Index non optimisé | Réduire la taille de l’index |
| Filtres non fonctionnels | Métadonnées manquantes | Ajouter les métadonnées Pagefind |
| Starlight non indexé | Configuration incorrecte | Vérifier l’intégration Starlight |
10.2. Tests manuels
# Génération de l'indexnpm run build:search
# Vérification de l'indexls -lh dist/_pagefind/
# Test de la recherche en localnpm run preview# Ouvrir http://localhost:4321 et tester la recherche
# Inspection de l'index (debug)npx pagefind --source dist --verbose10.3. Logs et monitoring
# Logs de buildnpm run build -- --verbose
# Logs Pagefindnpx pagefind --source dist --verbose
# Vérification de la taille de l'indexdu -sh dist/_pagefind/11. Bonnes pratiques
11.1. Configuration
- ✅ Exclure systématiquement les éléments de navigation et footer
- ✅ Utiliser des sélecteurs CSS précis pour les exclusions
- ✅ Définir des métadonnées cohérentes pour tous les types de contenu
- ✅ Tester l’indexation après chaque modification majeure
- ✅ Documenter les règles d’exclusion dans ce fichier
11.2. Contenu
- ✅ Utiliser une structure HTML sémantique (
<h1>,<h2>,<article>) - ✅ Identifier le contenu principal avec
data-pagefind-body - ✅ Fournir des titres descriptifs et uniques
- ✅ Éviter le contenu dupliqué entre pages
- ✅ Optimiser les images avant le build
11.3. Performance
- ✅ Surveiller la taille de l’index (objectif < 5 MB)
- ✅ Optimiser le ranking pour les contenus prioritaires
- ✅ Utiliser l’index chunké pour le lazy loading
- ✅ Tester les performances de recherche sur mobile
- ✅ Mesurer les Core Web Vitals avec la recherche active
11.4. Maintenance
- ✅ Régénérer l’index à chaque build (automatique)
- ✅ Vérifier les résultats de recherche après publication
- ✅ Ajuster les règles d’exclusion si nécessaire
- ✅ Documenter les changements de configuration
- ✅ Tester les filtres et les métadonnées régulièrement
12. Évolutions et roadmap
12.1. Améliorations planifiées
- [Évolution 1 : ex. Support du multi-langue (i18n)]
- [Évolution 2 : ex. Recherche facette avancée]
- [Évolution 3 : ex. Suggestions de recherche (autocomplete)]
12.2. Limitations connues
- ❌ Pagefind ne supporte pas nativement la recherche dynamique (SSR)
- ❌ L’index doit être régénéré à chaque build (pas de mise à jour incrémentale)
- ❌ Les filtres sont limités aux métadonnées définies au build
- ❌ La recherche full-text ne supporte pas nativement les langues non-latines
13. Ressources liées1/2
- Documentation Pagefind : Getting Started
- Documentation Pagefind : Indexing
- Documentation Pagefind : Search UI
- Documentation astro-pagefind : npm package
- DAT L2 : §8 - Stratégie de Recherche Unifiée (Pagefind)
- DAT L2 : §5.2 - Isolation de la Documentation (Starlight)
13. Ressources liées2/2
- Fichiers concernés :
astro.config.mjspagefind.yml(si applicable)src/components/ui/SearchBar.astrosrc/components/ui/SearchFilters.astrodist/_pagefind/(généré au build)
14. Historique des modifications1/2
| Date | Version | Description | Auteur |
|---|---|---|---|
| YYYY-MM-DD | 1.0 | Création initiale | [Nom] |
| YYYY-MM-DD | 1.1 | [Modification] | [Nom] |
14. Historique des modifications2/2
---
**Points clés de ce template :**- Documente la configuration complète de l'indexation Pagefind- Détaille les règles d'inclusion et d'exclusion (critique pour la pertinence)- Inclut l'intégration avec Starlight (index partagé)- Fournit la stratégie de ranking et de pondération- Couvre les métadonnées et les filtres (distinction visuelle des résultats)- Sépare clairement la configuration, le contenu, et l'UI- Inclut les bonnes pratiques de performance et de maintenance