Skip to main content

Recherche et Algolia

Cette page couvre la synchronisation Algolia telle qu’implémentée. Sources principales :
  • convex/integrations/algolia.ts
  • convex/schema.ts
  • web/src/app/search/page.tsx
  • web/src/app/admin/search/page.tsx
  • web/src/components/search.tsx
  • web/src/hooks/use-keyboard-navigation.ts

Variables et index (vérifié)

Variables lues :
  • NEXT_PUBLIC_ALGOLIA_APP_ID
  • ALGOLIA_WRITE_API_KEY
  • NEXT_PUBLIC_ALGOLIA_INDEX_NAME (défaut cel_public)
  • ALGOLIA_ADMIN_INDEX_NAME (défaut cel_admin)
Index destination :
  • public : NEXT_PUBLIC_ALGOLIA_INDEX_NAME
  • admin : ALGOLIA_ADMIN_INDEX_NAME

Types indexés (vérifié)

Public :
  • club
  • player
  • match
  • article
  • league
Admin :
  • user
  • transfer
  • sanction
  • audit_log
  • ea_unmatched
Le syncer rejette un type inconnu (Unsupported document type for Algolia sync).

syncDocument (unitaire)

  • lit/écrit un objet avec op: upsert|delete,
  • si ALGOLIA_WRITE_API_KEY ou NEXT_PUBLIC_ALGOLIA_APP_ID manquants : skip silencieux avec warning,
  • en delete : suppression directe dans l’index cible,
  • en upsert :
    • récupère le payload (getPublicSearchPayload ou getAdminSearchPayload),
    • si payload nul/insuffisant (supprimé, inactif, non publié), tente la suppression sur Algolia,
    • sinon PUT du payload.

Reindex global (vérifié)

Action reindexAllAction(indexType) supporte public | admin | all.
  • pagination : REINDEX_PAGE_SIZE = 100,
  • envoi par lot : ALGOLIA_BATCH_SIZE = 150 vers endpoint batch Algolia,
  • pour chaque type public/admin : pagine avec getPaginated...Payloads jusqu’à exhaustion,
  • renvoie { success: true }.

Requête de payloads pour reindex

  • getPaginatedPublicPayloads : source table par type public.
  • getPaginatedAdminPayloads : source table par type admin.

Surfaces Algolia frontend

La route /search consomme l’index public et propose les onglets :
  • club/clubs/:id
  • player/players/:userId
  • match/matches/:id
  • article/journal/:slug
  • league/leagues/:id
La route /admin/search et la recherche du header admin consomment l’index admin :
  • user/admin/users?search=...
  • transfer/admin/transfers?search=...
  • sanction/admin/sanctions?search=...
  • audit_log/admin/audit?search=...
  • ea_unmatched/admin/matches?search=...
Les deux pages filtrent les résultats par type côté client après réception des hits Algolia. Si l’App ID ou la clé search-only manque, la surface affiche son état « recherche non configurée ».

Index Convex searchIndex

Les occurrences searchIndex(...) observées dans schema.ts :
  • search_announcements → listes et administration des annonces,
  • search_articles → journal public et administration des articles,
  • search_audit_logs/admin/audit,
  • search_clubs → annuaire/recrutement public et /admin/clubs,
  • search_disputes/admin/disputes,
  • search_matches/admin/matches,
  • search_notifications/admin/notifications,
  • search_email_delivery_logs/admin/emails,
  • search_sanctions/admin/sanctions,
  • search_transfers/admin/transfers,
  • search_displayName et search_users → recherche de joueurs/recrues et administration des utilisateurs.
Ces index Convex alimentent les queries métier correspondantes ; ils sont distincts des deux index Algolia de recherche globale.
Last modified on July 16, 2026