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
|