365 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			365 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 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/search` retourne des résultats valides
 | 
						|
 | 
						|
**Test backend :**
 | 
						|
```bash
 | 
						|
curl "http://localhost:4000/api/search?q=test&limit=2"
 | 
						|
# Retourne: {"hits":[...], "estimatedTotalHits":..., "processingTimeMs":...}
 | 
						|
```
 | 
						|
 | 
						|
### Configuration
 | 
						|
- ✅ `USE_MEILI: true` dans `environment.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
 | 
						|
```typescript
 | 
						|
// src/core/search/search-meilisearch.service.ts
 | 
						|
console.log('[SearchMeilisearchService] Sending request:', url);
 | 
						|
console.log('[SearchMeilisearchService] Request completed');
 | 
						|
```
 | 
						|
 | 
						|
#### 2. SearchOrchestratorService
 | 
						|
```typescript
 | 
						|
// 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
 | 
						|
```typescript
 | 
						|
// 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
 | 
						|
 | 
						|
1. **Ouvrir DevTools** (F12)
 | 
						|
2. **Aller dans Console**
 | 
						|
3. **Taper une recherche** (ex: "test")
 | 
						|
4. **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
 | 
						|
 | 
						|
1. **Ouvrir DevTools** → **Network**
 | 
						|
2. **Filtrer** : `search`
 | 
						|
3. **Taper une recherche**
 | 
						|
4. **Vérifier** :
 | 
						|
   - ✅ Requête GET `/api/search?q=...`
 | 
						|
   - ✅ Status: 200 OK
 | 
						|
   - ✅ Response contient `hits` avec des données
 | 
						|
 | 
						|
### 3. Vérifier les Résultats Transformés
 | 
						|
 | 
						|
Dans la console, après une recherche :
 | 
						|
```javascript
 | 
						|
// Inspecter le signal results
 | 
						|
// (nécessite Angular DevTools ou breakpoint)
 | 
						|
```
 | 
						|
 | 
						|
## 🔧 Points de Vérification
 | 
						|
 | 
						|
### 1. Proxy Angular
 | 
						|
 | 
						|
**Fichier :** `proxy.conf.json`
 | 
						|
```json
 | 
						|
{
 | 
						|
  "/api": {
 | 
						|
    "target": "http://localhost:4000",
 | 
						|
    "secure": false,
 | 
						|
    "changeOrigin": true,
 | 
						|
    "logLevel": "warn"
 | 
						|
  }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
**Vérifier :**
 | 
						|
```bash
 | 
						|
# 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 :
 | 
						|
```typescript
 | 
						|
{
 | 
						|
  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 :**
 | 
						|
```html
 | 
						|
@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_MEILI` n'est pas à `true`
 | 
						|
- Service non injecté correctement
 | 
						|
- Observable non souscrit
 | 
						|
 | 
						|
**Solution :**
 | 
						|
```typescript
 | 
						|
// 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 request` présent
 | 
						|
- Pas de log `Request completed`
 | 
						|
- Erreur dans Network tab
 | 
						|
 | 
						|
**Causes possibles :**
 | 
						|
- Backend non démarré
 | 
						|
- Proxy mal configuré
 | 
						|
- CORS
 | 
						|
 | 
						|
**Solution :**
 | 
						|
```bash
 | 
						|
# 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 response` présent
 | 
						|
- `hits.length > 0`
 | 
						|
- Mais `matches.length === 0` dans transformed hit
 | 
						|
 | 
						|
**Causes possibles :**
 | 
						|
- `_formatted` absent dans la réponse Meilisearch
 | 
						|
- `excerpt` absent
 | 
						|
- 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 received` avec `arr.length > 0`
 | 
						|
- Mais rien ne s'affiche dans l'UI
 | 
						|
 | 
						|
**Causes possibles :**
 | 
						|
- Signal `results` non mis à jour
 | 
						|
- Composant SearchResults ne reçoit pas les données
 | 
						|
- Change detection non déclenchée
 | 
						|
 | 
						|
**Solution :**
 | 
						|
```typescript
 | 
						|
// 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 :**
 | 
						|
- `_formatted` absent
 | 
						|
- HTML échappé
 | 
						|
- Balises `<mark>` non rendues
 | 
						|
 | 
						|
**Solution :**
 | 
						|
Le code a été modifié pour :
 | 
						|
1. Détecter les balises `<mark>` dans `match.context`
 | 
						|
2. Retourner le HTML tel quel (sans échappement) si présent
 | 
						|
3. 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: true` dans `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
 | 
						|
 | 
						|
```bash
 | 
						|
# 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é
 | 
						|
 | 
						|
```bash
 | 
						|
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
 | 
						|
 | 
						|
```bash
 | 
						|
# 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
 | 
						|
 | 
						|
1. Ouvrir DevTools → Sources
 | 
						|
2. Trouver `search-panel.component.ts`
 | 
						|
3. Mettre un breakpoint sur `this.results.set(arr)`
 | 
						|
4. Taper une recherche
 | 
						|
5. Inspecter `arr` quand 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 :
 | 
						|
1. Retirer les `console.log` de débogage
 | 
						|
2. Optimiser le mapping si nécessaire
 | 
						|
3. Ajouter tests E2E
 | 
						|
4. Documenter le comportement final
 |