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 Meilisearchexcerptabsent- 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: truedansenvironment.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