9.1 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	Guide de Débogage de la Recherche Meilisearch
🔍 Problème Actuel
La recherche Meilisearch est activée mais les résultats ne s'affichent pas dans l'interface.
✅ Ce qui Fonctionne
Backend API
- ✅ Meilisearch est actif (port 7700)
- ✅ Backend Express est actif (port 4000)
- ✅ Index Meilisearch contient 642 documents
- ✅ API /api/searchretourne des résultats valides
Test backend :
curl "http://localhost:4000/api/search?q=test&limit=2"
# Retourne: {"hits":[...], "estimatedTotalHits":..., "processingTimeMs":...}
Configuration
- ✅ USE_MEILI: truedansenvironment.ts
- ✅ Proxy Angular configuré (/api→localhost:4000)
- ✅ HttpClient configuré dans index.tsx
Autres Fonctionnalités
- ✅ Bookmarks : Utilise /api/vault/bookmarks(backend)
- ✅ Calendrier : Utilise /api/files/metadata(backend)
- ✅ Vault : Utilise /api/vault(backend)
🐛 Logs de Débogage Ajoutés
Frontend
1. SearchMeilisearchService
// src/core/search/search-meilisearch.service.ts
console.log('[SearchMeilisearchService] Sending request:', url);
console.log('[SearchMeilisearchService] Request completed');
2. SearchOrchestratorService
// src/core/search/search-orchestrator.service.ts
console.log('[SearchOrchestrator] Calling Meilisearch with query:', query);
console.log('[SearchOrchestrator] Raw Meilisearch response:', response);
console.log('[SearchOrchestrator] Transformed hit:', { id, matchCount, result });
3. SearchPanelComponent
// src/components/search-panel/search-panel.component.ts
console.log('[SearchPanel] Results received:', arr);
console.error('[SearchPanel] Search error:', e);
🧪 Tests à Effectuer
1. Vérifier les Logs Console
- Ouvrir DevTools (F12)
- Aller dans Console
- Taper une recherche (ex: "test")
- Observer les logs dans l'ordre :
[SearchOrchestrator] Calling Meilisearch with query: test
[SearchMeilisearchService] Sending request: /api/search?q=test&limit=20&highlight=true
[SearchMeilisearchService] Request completed
[SearchOrchestrator] Raw Meilisearch response: {hits: [...], ...}
[SearchOrchestrator] Transformed hit: {id: "...", matchCount: 1, result: {...}}
[SearchPanel] Results received: [{noteId: "...", matches: [...], ...}]
2. Vérifier l'Onglet Network
- Ouvrir DevTools → Network
- Filtrer : search
- Taper une recherche
- Vérifier :
- ✅ Requête GET /api/search?q=...
- ✅ Status: 200 OK
- ✅ Response contient hitsavec des données
 
- ✅ Requête GET 
3. Vérifier les Résultats Transformés
Dans la console, après une recherche :
// Inspecter le signal results
// (nécessite Angular DevTools ou breakpoint)
🔧 Points de Vérification
1. Proxy Angular
Fichier : proxy.conf.json
{
  "/api": {
    "target": "http://localhost:4000",
    "secure": false,
    "changeOrigin": true,
    "logLevel": "warn"
  }
}
Vérifier :
# Depuis le navigateur (port 3000)
curl http://localhost:3000/api/search?q=test
# Doit retourner les mêmes résultats que :
curl http://localhost:4000/api/search?q=test
2. Transformation des Résultats
Code : src/core/search/search-orchestrator.service.ts
Le mapping Meilisearch → SearchResult doit produire :
{
  noteId: string,      // ID du document
  matches: [           // Au moins 1 match
    {
      type: 'content',
      text: string,
      context: string,  // Contenu avec <mark> ou texte brut
      ranges: []
    }
  ],
  score: 100,
  allRanges: []
}
Problème potentiel : Si matches est vide, rien ne s'affiche.
Solution : Le code a été modifié pour toujours créer au moins un match avec excerpt ou content.
3. Affichage des Résultats
Composant : SearchResultsComponent
Vérifier dans le template :
@if (sortedGroups().length === 0) {
  <!-- Message "No results" -->
} @else {
  <!-- Liste des résultats -->
  @for (group of sortedGroups(); track group.noteId) {
    <!-- Affichage du groupe -->
  }
}
Signal à inspecter :
- results(): Doit contenir les SearchResult[]
- sortedGroups(): Doit contenir les ResultGroup[]
🚨 Problèmes Possibles
Problème 1 : Requête HTTP ne part pas
Symptômes :
- Aucun log [SearchMeilisearchService] Sending request
- Aucune requête dans Network tab
Causes possibles :
- USE_MEILIn'est pas à- true
- Service non injecté correctement
- Observable non souscrit
Solution :
// Vérifier dans environment.ts
export const environment = {
  USE_MEILI: true, // ← Doit être true
  // ...
};
Problème 2 : Requête part mais pas de réponse
Symptômes :
- Log [SearchMeilisearchService] Sending requestprésent
- Pas de log Request completed
- Erreur dans Network tab
Causes possibles :
- Backend non démarré
- Proxy mal configuré
- CORS
Solution :
# Vérifier backend
curl http://localhost:4000/api/search?q=test
# Vérifier proxy
# Redémarrer ng serve si nécessaire
Problème 3 : Réponse reçue mais pas de résultats
Symptômes :
- Log [SearchOrchestrator] Raw Meilisearch responseprésent
- hits.length > 0
- Mais matches.length === 0dans transformed hit
Causes possibles :
- _formattedabsent dans la réponse Meilisearch
- excerptabsent
- Mapping incorrect
Solution :
Le code a été modifié pour créer un match de fallback avec excerpt ou un extrait de content.
Problème 4 : Résultats transformés mais pas affichés
Symptômes :
- Log [SearchPanel] Results receivedavecarr.length > 0
- Mais rien ne s'affiche dans l'UI
Causes possibles :
- Signal resultsnon mis à jour
- Composant SearchResults ne reçoit pas les données
- Change detection non déclenchée
Solution :
// Vérifier que results.set() est appelé
this.results.set(arr);
this.hasSearched.set(true);
Problème 5 : Highlighting ne fonctionne pas
Symptômes :
- Résultats affichés
- Mais pas de surlignage (balises <mark>)
Causes possibles :
- _formattedabsent
- HTML échappé
- Balises <mark>non rendues
Solution : Le code a été modifié pour :
- Détecter les balises <mark>dansmatch.context
- Retourner le HTML tel quel (sans échappement) si présent
- Sinon, utiliser le highlighter local
📋 Checklist de Débogage
- Backend démarré (node server/index.mjs)
- Frontend démarré (npm run dev)
- Meilisearch actif (docker ps | grep meilisearch)
- USE_MEILI: truedans- environment.ts
- Hard refresh du navigateur (Ctrl+Shift+R)
- DevTools Console ouverte
- DevTools Network tab ouverte
- Taper une recherche (2+ caractères)
- Vérifier logs console (ordre attendu)
- Vérifier requête HTTP dans Network
- Vérifier réponse JSON (hits présents)
- Vérifier transformation (matches non vide)
- Vérifier affichage (liste de résultats visible)
🔄 Workflow de Test Complet
# 1. Vérifier Meilisearch
docker ps | grep meilisearch
curl http://127.0.0.1:7700/health
# 2. Vérifier Backend
curl "http://localhost:4000/api/search?q=test&limit=1"
# Doit retourner JSON avec hits
# 3. Démarrer Frontend (si pas déjà fait)
npm run dev
# 4. Ouvrir navigateur
# http://localhost:3000
# 5. Ouvrir DevTools (F12)
# - Console tab
# - Network tab
# 6. Taper recherche
# - Minimum 2 caractères
# - Observer logs console
# - Observer requête Network
# 7. Vérifier affichage
# - Liste de résultats doit apparaître
# - Cliquer sur un groupe pour voir les matches
# - Vérifier highlighting (balises <mark>)
🆘 Si Rien Ne Fonctionne
Étape 1 : Vérifier Backend Isolé
curl -v "http://localhost:4000/api/search?q=test&limit=1"
Attendu :
- Status: 200 OK
- Content-Type: application/json
- Body: {"hits":[...], ...}
Étape 2 : Vérifier Proxy
# Depuis un autre terminal
curl "http://localhost:3000/api/search?q=test&limit=1"
Attendu : Même réponse que backend direct
Étape 3 : Vérifier Logs Backend
Dans le terminal où node server/index.mjs tourne :
[Meili] Search query: test
[Meili] Results: 1 hits in 15ms
Étape 4 : Vérifier Logs Frontend
Dans la console du navigateur :
[SearchOrchestrator] Calling Meilisearch with query: test
[SearchMeilisearchService] Sending request: /api/search?q=test&limit=20&highlight=true
Étape 5 : Breakpoint Debugging
- Ouvrir DevTools → Sources
- Trouver search-panel.component.ts
- Mettre un breakpoint sur this.results.set(arr)
- Taper une recherche
- Inspecter arrquand le breakpoint est atteint
📊 Métriques de Performance
Une fois fonctionnel, vérifier :
- Temps de recherche : < 100ms (Meili + réseau)
- Nombre de résultats : Dépend de la requête
- Highlighting : Balises <mark>présentes
- Pas de gel UI : Interface reste réactive
🎯 Prochaines Étapes
Une fois la recherche fonctionnelle :
- Retirer les console.logde débogage
- Optimiser le mapping si nécessaire
- Ajouter tests E2E
- Documenter le comportement final