Recherche plein-texte
Les offres et les candidats sont indexés en PostgreSQL viatsvector avec configuration french. Les résultats sont triés par pertinence + date.
Pipeline d’indexation
Pondération des colonnes
| Weight | Facteur de rang | Champs |
|---|---|---|
| A | 1.0 | titre |
| B | 0.4 | competences_requises (tableau) |
| C | 0.2 | secteur, type_contrat, ville, niveau_experience |
| D | 0.1 | description |
Requête type
Syntaxe utilisateur (websearch_to_tsquery)
| Input | Interprétation | |
|---|---|---|
développeur java | développeur & java | |
développeur OR python | `développeur | python` |
"lead developer" | Phrase exacte | |
java -senior | java & !senior | |
dev* | Préfixe (avec tsquery custom) |
Endpoints concernés
| Endpoint | Index |
|---|---|
GET /v1/api/offres/search | offres.search_vector |
GET /v1/api/offres/autocomplete | offres.titre (trigram) |
GET /v1/api/admin/candidates | candidats.search_vector |
GET /v1/api/vivier/search | idem |
Autocomplete
Séparé de la recherche principale — utilise pg_trgm (trigrams) pour la tolérance aux fautes.Filtres combinables
Paramètres de recherche
| Paramètre | Type | Exemple |
|---|---|---|
q | string | développeur java |
secteur | array | SOFTWARE,FINANCE |
ville | string | Douala |
typeContrat | array | CDI,CDD |
niveauExperience | string | SENIOR |
salaireMin | int | 500000 |
dateDebut | date | 2026-01-01 |
entrepriseId | long | 42 |
page | int | 0 |
size | int | 20 |
sort | string | relevance,desc / published_at,desc |
Limitations
Rafraîchissement de l’index
L’index GIN est mis à jour en synchrone via trigger. Pas de job asynchrone nécessaire.Monitoring
Candidats — recherche recruteur
La recherche candidats (accessible aux recruteurs via vivier) est plus restreinte :- Le candidat doit avoir opté pour la visibilité publique de son profil
- Les critères sont : compétences, niveau d’expérience, secteur, ville
- La description libre et le CV ne sont pas indexés dans
search_vector(RGPD)