Skip to main content

Rechercher des offres

L’API expose une recherche PostgreSQL tsvector + trigram pour l’autocomplete.

Vue d’ensemble

Autocomplete (suggestions)

Utilise pg_trgm (trigram similarity) — tolère les fautes.

Requête

GET /v1/api/offres/autocomplete?q=dev HTTP/1.1

Réponse

{
  "suggestions": [
    "Développeur Backend Java (H/F)",
    "Développeur Frontend React (H/F)",
    "Développeur Fullstack",
    "DevOps Engineer"
  ]
}
Cache Redis 60 secondes.

Recherche plein-texte

Syntaxe utilisateur

EntréeComportement
java springLes deux termes doivent apparaître
java OR pythonL’un ou l’autre
"lead developer"Phrase exacte
java -juniorContient java, exclut junior

Filtres combinables

GET /v1/api/offres/search?q=java
  &secteur=SOFTWARE
  &typeContrat=CDI,CDD
  &niveauExperience=SENIOR
  &villeId=101
  &salaireMin=600000
  &teletravail=true
  &page=0&size=20
  &sort=relevance,desc

Réponse

{
  "content": [
    {
      "id": 123,
      "slug": "dev-backend-java-douala-123",
      "titre": "Développeur Backend Java (H/F)",
      "entreprise": { "nom": "Tech Corp", "logoUrl": "..." },
      "ville": { "nom": "Douala" },
      "typeContrat": "CDI",
      "salaire": { "min": 600000, "max": 900000, "devise": "XAF" },
      "publishedAt": "2026-04-15T09:30:00Z",
      "rank": 0.85
    }
  ],
  "page": 0,
  "size": 20,
  "totalElements": 47,
  "totalPages": 3
}

Diagramme de requête

Tri

Valeur sortComportement
relevance,descRank tsvector (défaut quand q présent)
published_at,descDate (défaut si pas de q)
salaire_max,descSalaire maximum
date_expiration,ascExpirant bientôt

Compter sans charger

GET /v1/api/offres/count?secteur=SOFTWARE HTTP/1.1
{ "count": 128 }

Pagination

Voir Pagination. Cap : size ≤ 100, page ≤ 500.

Cas pratiques

Offres récentes Douala

GET /v1/api/offres/search?villeId=101&size=10&sort=published_at,desc

Candidatures ouvertes pour dev senior

GET /v1/api/offres/search?q=developpeur&niveauExperience=SENIOR&size=50

Télétravail partout

GET /v1/api/offres/search?teletravail=true

Snippet JS

async function searchOffres(q, filters = {}) {
  const params = new URLSearchParams({ q, ...filters, page: 0, size: 20 });
  const r = await fetch(`/v1/api/offres/search?${params}`);
  return r.json();
}

const data = await searchOffres('java spring', {
  typeContrat: 'CDI',
  niveauExperience: 'SENIOR',
  villeId: 101,
});
console.log(`${data.totalElements} offres`);

Limitations

Voir Recherche plein-texte pour les détails techniques.