Principes de base des offres d'emploi (v3)

Une ressource Job (offre d'emploi) représente une offre d'emploi ou une liste d'offres d'emploi (ou encore une "mission" ou une "demande d'ouverture de poste" selon le contexte). Une offre d'emploi appartient à une entreprise (Company) qui est l'entité responsable du recrutement pour ce poste.

Un objet Job peut être manipulé au moyen des méthodes de création (create), de mise à jour (update) et de suppression (delete). On y accède via les méthodes list et get. Comptez jusqu'à cinq minutes pour que les modifications deviennent effectives dans l'index de Cloud Talent Solutions.

Les offres d'emploi sont délimitées par le champ d'application d'un compte de service. Les données des offres d'emploi ne sont accessibles qu'aux requêtes de recherche authentifiées à l'aide des identifiants du compte de service correspondant.

Pour faciliter la résolution des problèmes et la catégorisation, synchronisez l'index des offres d'emploi de Cloud Talent Solution avec votre propre index, et maintenez une relation entre le nom (name) généré par Cloud Talent Solution et l'identifiant unique de l'offre dans votre système. La modification et la création d'emplois dans votre système nécessite d'envoyer à Cloud Talent Solution un appel CRUD adéquat en temps réel pour que ces modifications soient immédiatement prises en compte. L'index Cloud Talent Solution doit être ajouté au pipeline existant d'ingestion des emplois.

Créer un job

Pour créer une offre d'emploi, consultez le guide Démarrage rapide : Créer des entreprises et des offres d'emploi pour plus de détails.

Java

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


/** Create a job. */
public static Job createJob(Job jobToBeCreated) throws IOException {
  try {
    CreateJobRequest createJobRequest = new CreateJobRequest().setJob(jobToBeCreated);

    Job jobCreated =
        talentSolutionClient
            .projects()
            .jobs()
            .create(DEFAULT_PROJECT_ID, createJobRequest)
            .execute();
    System.out.println("Job created: " + jobCreated);
    return jobCreated;
  } catch (IOException e) {
    System.out.println("Got exception while creating job");
    throw e;
  }
}

Python

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.

def create_job(client_service, job_to_be_created):
    try:
        request = {"job": job_to_be_created}
        job_created = (
            client_service.projects()
            .jobs()
            .create(parent=parent, body=request)
            .execute()
        )
        print("Job created: %s" % job_created)
        return job_created
    except Error as e:
        print("Got exception while creating job")
        raise e

Go

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


// createJob create a job as given.
func createJob(w io.Writer, projectID string, jobToCreate *talent.Job) (*talent.Job, error) {
	ctx := context.Background()

	client, err := google.DefaultClient(ctx, talent.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %w", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %w", err)
	}

	parent := "projects/" + projectID
	req := &talent.CreateJobRequest{
		Job: jobToCreate,
	}
	job, err := service.Projects.Jobs.Create(parent, req).Do()
	if err != nil {
		return nil, fmt.Errorf("Failed to create job %q, Err: %w", jobToCreate.RequisitionId, err)
	}
	return job, err
}

Champs obligatoires

Les champs suivants doivent être renseignés lors de la création et de la mise à jour d'un objet emploi (Job) :

  • companyName : nom de la ressource de l'entreprise répertoriant l'offre d'emploi, par exemple, projects/[PROJECT_ID]/companies/[COMPANY_ID].

  • requisitionId : ID de la demande de recrutement, également appelé ID de l'offre, attribué par le client pour identifier une offre d'emploi. Ce champ est destiné à être utilisé par les clients pour l'identification du client et le suivi des offres d'emploi. Nombre maximum de caractères autorisés : 225.

    L'unicité d'une offre d'emploi est déterminée à l'aide d'une combinaison des paramètres requisitionID, companyName et des paramètres régionaux du poste. Si un poste est créé avec une clé spécifique composée de ces attributs, cette clé est stockée dans l'index de Cloud Talent Solution. Tant que le poste n'est pas supprimé, aucun autre poste comportant ces mêmes champs ne peut être créé.

  • title : intitulé du poste, par exemple "Ingénieur logiciel". Le nombre maximal de caractères autorisés est de 500

    Pour résoudre le problème des résultats de recherche manqués du fait d'intitulés de poste non standards, Cloud Talent Solution exploite tous les champs renseignés dans l'offre d'emploi pour comprendre le contexte et stocker en interne un intitulé "nettoyé". Lorsqu'une requête de recherche est envoyée au service, la requête est également nettoyée puis mappée par les ontologies avec les emplois correspondants.

  • description : description de l'offre d'emploi, qui comprend généralement une description de l'entreprise et des informations connexes structurées en plusieurs paragraphes. Des champs distincts sont fournis dans l'objet de l'offre d'emploi pour décrire les responsabilités, les qualifications requises et autres caractéristiques. Il est recommandé d'utiliser ces champs de description distincts.

    Ce champ accepte et nettoie les saisies au format HTML et autorise l'utilisation de balises de mise en forme (gras, italique, listes numérotées ou listes à puces). Le nombre maximal de caractères autorisés est de 100 000.

Choisissez l'une des options suivantes :

  • applicationInfo.uris[] : URL des pages de candidature.

  • applicationInfo.emails[] : adresses e-mail pour l'envoi des CV ou candidatures.

  • applicationInfo.instruction : instructions pour soumettre une candidature, telles que "Envoyez votre candidature à ...". Ce champ accepte et nettoie les saisies au format HTML et autorise l'utilisation de balises de mise en forme (gras, italique, listes numérotées et listes à puces). Nombre maximum de caractères autorisés : 3 000.

Champs couramment utilisés

  • postingExpireTime : heure à laquelle l'offre d'emploi expire, basée sur l'horodatage. Une fois le délai écoulé, l'offre d'emploi est marquée comme expirée et n'apparaît plus dans les résultats de recherche. Cette date doit être antérieure au 31/12/2100 dans le fuseau horaire UTC. Les dates non valides (telles que les dates passées) sont ignorées. La date d'expiration par défaut d'une offre d'emploi est fixée à 30 jours après son heure de création dans le fuseau horaire UTC.

    Le contenu des offres d'emploi expirées peut toujours être récupéré jusqu'à 60 jours après l'expiration à l'aide de l'opérateur GET. Passé ce délai de 60 jours, l'offre d'emploi n'est plus renvoyée par l'opérateur GET.

  • addresses[] : lieux de recrutement pour le poste. Il est recommandé de fournir les adresses complètes des lieux d'embauche afin d'améliorer les résultats de l'API, y compris les recherches d'emploi effectuées en fonction du temps de trajet. Le nombre maximum de caractères autorisés est de 500. De plus amples informations sur addresses[] sont disponibles dans la section Bonnes pratiques ci-dessous.

  • promotionValue : une valeur supérieure à 0 définit l'offre comme une "sélection d'emploi", qui n'est renvoyée qu'à l'occasion de recherches d'emploi de type FEATURED_JOBS. Plus la valeur est élevée, plus l'offre apparaît haut dans les résultats de recherche. Pour en savoir plus, consultez la section Sélection d'emplois.

Champs personnalisés

  • customAttributes : ce champ stocke jusqu'à 100 attributs personnalisés permettant de stocker les données personnalisées de l'offre d'emploi. Ces champs peuvent être utilisés comme critères de filtrage en spécifiant le champ jobQuery dans la requête de recherche d'emploi. De plus, n'importe lequel de ces champs peut être défini dans l'attribut keywordSearchableJobCustomAttributes de l'entreprise, donc un terme de recherche ayant une correspondance exacte avec l'un des champs de keywordSearchableJobCustomAttributes renvoie les offres d'emploi qui incluent la correspondance.

Mettre à jour une offre d'emploi

Mettre à jour une offre d'emploi sans fieldMask

Java

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


/** Update a job. */
public static Job updateJob(String jobName, Job jobToBeUpdated) throws IOException {
  try {
    UpdateJobRequest updateJobRequest = new UpdateJobRequest().setJob(jobToBeUpdated);
    Job jobUpdated =
        talentSolutionClient.projects().jobs().patch(jobName, updateJobRequest).execute();
    System.out.println("Job updated: " + jobUpdated);
    return jobUpdated;
  } catch (IOException e) {
    System.out.println("Got exception while updating job");
    throw e;
  }
}

Python

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.

def update_job(client_service, job_name, job_to_be_updated):
    try:
        request = {"job": job_to_be_updated}
        job_updated = (
            client_service.projects()
            .jobs()
            .patch(name=job_name, body=request)
            .execute()
        )
        print("Job updated: %s" % job_updated)
        return job_updated
    except Error as e:
        print("Got exception while updating job")
        raise e

Go

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


// updateJob update a job with all fields except name.
func updateJob(w io.Writer, jobName string, jobToUpdate *talent.Job) (*talent.Job, error) {
	ctx := context.Background()

	client, err := google.DefaultClient(ctx, talent.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %w", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %w", err)
	}

	req := &talent.UpdateJobRequest{
		Job: jobToUpdate,
	}
	job, err := service.Projects.Jobs.Patch(jobName, req).Do()
	if err != nil {
		return nil, fmt.Errorf("Failed to update job %s: %w", jobName, err)
	}

	return job, err
}

Mettre à jour une offre d'emploi avec fieldMask

Java

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


/** Update a job. */
public static Job updateJobWithFieldMask(String jobName, String fieldMask, Job jobToBeUpdated)
    throws IOException {
  try {
    UpdateJobRequest updateJobRequest =
        new UpdateJobRequest().setUpdateMask(fieldMask).setJob(jobToBeUpdated);
    Job jobUpdated =
        talentSolutionClient.projects().jobs().patch(jobName, updateJobRequest).execute();
    System.out.println("Job updated: " + jobUpdated);
    return jobUpdated;
  } catch (IOException e) {
    System.out.println("Got exception while updating job");
    throw e;
  }
}

Python

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.

def update_job_with_field_mask(client_service, job_name, job_to_be_updated, field_mask):
    try:
        request = {"job": job_to_be_updated, "update_mask": field_mask}
        job_updated = (
            client_service.projects()
            .jobs()
            .patch(name=job_name, body=request)
            .execute()
        )
        print("Job updated: %s" % job_updated)
        return job_updated
    except Error as e:
        print("Got exception while updating job with field mask")
        raise e

Go

Pour en savoir plus sur l'installation et la création d'un client Cloud Talent Solution, consultez la page Bibliothèques clientes Cloud Talent Solution.


// updateJobWithMask updates a job by name with specific fields.
// mask is a comma separated list top-level fields of talent.Job.
func updateJobWithMask(w io.Writer, jobName string, mask string, jobToUpdate *talent.Job) (*talent.Job, error) {
	ctx := context.Background()

	client, err := google.DefaultClient(ctx, talent.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %w", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %w", err)
	}

	req := &talent.UpdateJobRequest{
		Job:        jobToUpdate,
		UpdateMask: mask,
	}
	job, err := service.Projects.Jobs.Patch(jobName, req).Do()
	if err != nil {
		log.Fatalf("Failed to update job %s with field mask %s, Err: %v", jobName, mask, err)
	}

	return job, err
}

Bonnes pratiques

Champs de localisation géographique

Dans la mesure du possible, nous vous recommandons de renseigner l'adresse postale d'un emploi dans le champ addresses[]. Vous affinerez ainsi la localisation et la pertinence de l'offre. Si aucune rue ne peut être indiquée, saisissez autant d'informations que possible. Les adresses sont acceptées jusqu'au niveau du pays. Les références de région (telles que "Nord-Ouest Pacifique") ne sont pas acceptées.

Cloud Talent Solution utilise les données du champ addresses[] pour renseigner le champ derivedInfo.locations[] (sortie uniquement). En l'absence d'adresse complète, le service utilise d'autres références, telles que le nom de l'entreprise, pour déterminer s'il est possible de déduire une adresse plus précise pour l'offre d'emploi.

Par exemple, si l'emplacement d'une offre d'emploi dans le secteur informatique est défini comme étant Mountain View et que l'entreprise concernée est Google, le service analyse l'objet headquartersAddress correspondant pour identifier si le champ comporte une adresse plus précise et si cette adresse est située dans la même ville que l'offre. Si tel est le cas, le service comprend que l'emploi à pourvoir est "probablement" à cette adresse et renseigne le champ derivedInfo.locations[] en conséquence.

Si les données d'adresse de l'entreprise ne sont pas disponibles, le service utilise une combinaison de connaissances exclusives et d'informations sur l'emploi/l'entreprise pour renseigner le champ derivedInfo.locations[].

Étant donné que la valeur derivedInfo.locations[] représente la meilleure estimation possible, vous pouvez aussi utiliser les données des champs derivedInfo.locations[] ou addresses pour afficher l'adresse de l'offre d'emploi.

Une offre d'emploi ne peut pas être associée à plus de 50 emplacements. Si une offre doit être associée à davantage d'emplacements, vous pouvez créer plusieurs offres d'emploi identiques possédant chacune un attribut requisitionID unique (par exemple, "ReqA", "ReqA-1", "ReqA-2", etc.). En effet, il n'est pas possible de créer plusieurs offres ayant les mêmes attributs requisitionId, companyName et languageCode. Si l'attribut original requisitionId doit être conservé, définissez un paramètre CustomAttribute pour le stockage. Il est recommandé de regrouper les emplacements géographiques les plus proches dans la même offre d'emploi pour faciliter la recherche.

Adresses acceptées

Toute adresse reconnue par l'API Google Maps Geocoding (dans le champ formattedAddress) est acceptée par Cloud Talent Solution. Si vous tentez de créer une offre d'emploi ou d'exécuter une recherche à l'aide d'une adresse non reconnue, le service renvoie une erreur 400.

Si une adresse professionnelle est mal référencée dans l'API Google Maps Geocoding, remplissez un rapport de bug pour le signaler. Comptez jusqu'à cinq jours pour que la correction soit effective.

Saisie semi-automatique des adresses

Cloud Talent Solution ne propose pas de suggestions de saisie semi-automatique pour les emplacements de postes. Utilisez l'API Google Maps Places ou d'autres services de localisation similaires pour alimenter les suggestions de saisie semi-automatique.

Emplois à l'échelle d'un État, d'un pays ou en télétravail

Le champ postingRegion permet de spécifier si le poste est proposé au niveau de l'État, du pays ou en télétravail.

  • Les offres d'emploi au niveau ADMINISTRATIVE_AREA et NATION apparaissent dans les résultats des recherches pour lesquelles l'emplacement existe dans l'État ou le pays définis dans l'offre. Par exemple, si une offre d'emploi ADMINISTRATIVE_AREA est publiée dans "WA, USA", elle est renvoyée si le champ LocationFilter indique "Seattle".

  • Les offres d'emploi TELECOMMUTE sont renvoyées dans toute recherche liée à un emplacement, mais elles sont considérées comme moins pertinentes. Elles peuvent être ciblées dans une recherche en définissant l'option telecommutePreference sur TELECOMMUTE_ALLOWED dans le champ LocationFilter de la recherche.