# 📊 SystĂšme d'Analytics & Tracking des Recherches ## Vue d'ensemble Le systĂšme d'analytics d'EduConnect Africa collecte et analyse toutes les recherches effectuĂ©es sur la plateforme pour comprendre les intĂ©rĂȘts et comportements des utilisateurs. ## Architecture ### ModĂšles de DonnĂ©es #### SearchLog Enregistre chaque recherche individuelle avec : - **Utilisateur** : Qui a effectuĂ© la recherche (null si anonyme) - **CatĂ©gorie** : Type de contenu recherchĂ© (QUESTIONS, MENTORS, OPPORTUNITIES, etc.) - **RequĂȘte** : Terme de recherche saisi - **Filtres** : Filtres appliquĂ©s (JSON flexible) - **RĂ©sultats** : Nombre de rĂ©sultats retournĂ©s - **MĂ©tadonnĂ©es** : Session ID, IP, User Agent, URL - **Interaction** : RĂ©sultat cliquĂ© et sa position #### PopularSearch Vue matĂ©rialisĂ©e des recherches les plus populaires : - CatĂ©gorie - RequĂȘte - Nombre de fois recherchĂ©e - DerniĂšre recherche ### API Endpoints #### 1. Enregistrer une recherche ```http POST /api/analytics/search-log/ Content-Type: application/json { "category": "QUESTIONS", "search_query": "python django", "filters_applied": { "status": "unsolved", "tags": ["python"] }, "results_count": 15 } Response: 201 Created { "id": 123, "category": "QUESTIONS", "search_query": "python django", "filters_applied": {...}, "results_count": 15, "created_at": "2024-12-04T23:00:00Z" } ``` #### 2. Enregistrer un clic sur un rĂ©sultat ```http POST /api/analytics/result-click/ Content-Type: application/json { "search_log_id": 123, "result_id": "456", "position": 2 } Response: 200 OK { "status": "success" } ``` #### 3. RĂ©cupĂ©rer les recherches populaires ```http GET /api/analytics/popular-searches/?category=QUESTIONS&limit=10 Response: 200 OK [ { "category": "QUESTIONS", "search_query": "python", "search_count": 245, "last_searched": "2024-12-04T22:30:00Z" }, ... ] ``` #### 4. RĂ©cupĂ©rer les recherches tendances ```http GET /api/analytics/trending-searches/?category=QUESTIONS&days=7&limit=10 Response: 200 OK [ { "search_query": "django rest framework", "count": 45 }, ... ] ``` ## Utilisation Frontend ### Hook React : `useSearchTracking` Le hook personnalisĂ© facilite l'intĂ©gration du tracking dans les composants. #### Exemple d'intĂ©gration dans Questions.tsx ```tsx import { useSearchTracking } from '../hooks/useSearchTracking'; const Questions: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); const [filter, setFilter] = useState<'all' | 'solved' | 'unsolved'>('all'); const [questions, setQuestions] = useState([]); // Initialiser le tracking pour la catĂ©gorie QUESTIONS const { trackSearch, trackClick } = useSearchTracking('QUESTIONS'); const fetchQuestions = async () => { try { const data = await forumService.getQuestions({ page: currentPage, search: searchTerm, filter: filter === 'all' ? undefined : filter }); setQuestions(data.results); // Tracker la recherche await trackSearch( searchTerm, { filter, page: currentPage }, data.count ); } catch (error) { console.error("Failed to fetch questions", error); } }; const handleQuestionClick = (questionId: string, position: number) => { // Tracker le clic sur le rĂ©sultat trackClick(null, questionId, position); // Naviguer vers la question navigate(`/questions/${questionId}`); }; return ( // ... JSX ); }; ``` ### Service Direct Si vous prĂ©fĂ©rez utiliser le service directement : ```tsx import { analyticsService } from '../services/analytics'; // Enregistrer une recherche const logId = await analyticsService.logSearch({ category: 'MENTORS', search_query: 'python expert', filters_applied: { specialties: ['python', 'django'] }, results_count: 8 }); // Enregistrer un clic await analyticsService.logResultClick({ search_log_id: logId.id, result_id: 'mentor-123', position: 0 }); // RĂ©cupĂ©rer les recherches populaires const popular = await analyticsService.getPopularSearches('QUESTIONS', 10); // RĂ©cupĂ©rer les tendances const trending = await analyticsService.getTrendingSearches('MENTORS', 7, 10); ``` ## CatĂ©gories de Recherche | CatĂ©gorie | Description | Pages concernĂ©es | |-----------|-------------|------------------| | `QUESTIONS` | Questions du forum | `/questions` | | `MENTORS` | Recherche de mentors | `/mentors` | | `OPPORTUNITIES` | Bourses, stages, concours | `/opportunities` | | `TOOLS` | Outils pĂ©dagogiques | `/tools` | | `USERS` | Recherche d'utilisateurs | Divers | | `GENERAL` | Recherche globale | Barre de recherche gĂ©nĂ©rale | ## Analyses Disponibles ### 1. Recherches Populaires - Top 10/20/50 des recherches les plus frĂ©quentes - Par catĂ©gorie ou globalement - Mise Ă  jour en temps rĂ©el ### 2. Tendances - Recherches en hausse sur les 7/14/30 derniers jours - DĂ©tection de nouveaux sujets d'intĂ©rĂȘt - Comparaison temporelle ### 3. Taux de Clic (CTR) - Pourcentage de recherches suivies d'un clic - Position moyenne des clics - RĂ©sultats les plus cliquĂ©s ### 4. Recherches Sans RĂ©sultats - Identifier les lacunes de contenu - OpportunitĂ©s d'amĂ©lioration - Suggestions de nouveaux contenus ## Exemples de RequĂȘtes SQL Utiles ### Top 10 des recherches cette semaine ```sql SELECT search_query, COUNT(*) as count FROM search_logs WHERE created_at >= NOW() - INTERVAL '7 days' AND category = 'QUESTIONS' GROUP BY search_query ORDER BY count DESC LIMIT 10; ``` ### Recherches sans rĂ©sultats ```sql SELECT search_query, COUNT(*) as count FROM search_logs WHERE results_count = 0 AND created_at >= NOW() - INTERVAL '30 days' GROUP BY search_query ORDER BY count DESC LIMIT 20; ``` ### Taux de clic par catĂ©gorie ```sql SELECT category, COUNT(*) as total_searches, COUNT(clicked_result_id) as clicks, ROUND(100.0 * COUNT(clicked_result_id) / COUNT(*), 2) as ctr_percentage FROM search_logs WHERE created_at >= NOW() - INTERVAL '30 days' GROUP BY category ORDER BY ctr_percentage DESC; ``` ## IntĂ©gration RecommandĂ©e ### Pages Ă  Tracker 1. **Questions** (`/questions`) - Recherche par mots-clĂ©s - Filtres : solved/unsolved, tags 2. **Mentors** (`/mentors`) - Recherche par nom, spĂ©cialitĂ©s - Filtres : rating, disponibilitĂ© 3. **OpportunitĂ©s** (`/opportunities`) - Recherche par titre, provider - Filtres : type, deadline, location 4. **Outils** (`/tools`) - Recherche par nom d'outil - Filtres : catĂ©gorie ### Bonnes Pratiques 1. **Debounce** : Attendre 300-500ms aprĂšs la derniĂšre frappe avant de tracker 2. **Minimum de caractĂšres** : Ne tracker que si ≄ 2 caractĂšres 3. **Anonymisation** : Respecter la vie privĂ©e (pas de donnĂ©es sensibles) 4. **Performance** : Tracker en arriĂšre-plan (async, non-bloquant) 5. **Erreurs** : Ne jamais bloquer l'UX si le tracking Ă©choue ## Dashboard Admin Dans l'admin Django (`/admin/analytics/`), vous pouvez : - Consulter tous les logs de recherche - Filtrer par catĂ©gorie, date, utilisateur - Voir les recherches populaires - Exporter les donnĂ©es pour analyse externe ## Prochaines Étapes 1. **Dashboard Analytics** : Interface dĂ©diĂ©e pour visualiser les tendances 2. **Suggestions Intelligentes** : AutocomplĂ©tion basĂ©e sur les recherches populaires 3. **A/B Testing** : Tester diffĂ©rentes interfaces de recherche 4. **Machine Learning** : Recommandations personnalisĂ©es basĂ©es sur l'historique 5. **Alertes** : Notification quand un nouveau sujet devient tendance --- **DĂ©veloppĂ© avec ❀ par Marino ATOHOUN pour Hypee**