Aspectos básicos de los empleos (v3)

Un recurso Job representa una oferta de empleo (también denominada "anuncio de empleo" o "solicitud de empleo"). Un trabajo pertenece a una empresa que es la entidad contratante responsable del trabajo.

Un trabajo se puede manipular con los métodos de creación, actualización y eliminación, y se accede a él con los métodos de lista y obtención. El índice de Cloud Talent Solution puede tardar hasta 5 minutos en reflejar los cambios.

Los trabajos se incluyen en el ámbito de una cuenta de servicio. Solo se pueden usar las solicitudes de búsqueda autenticadas con las credenciales de una cuenta de servicio concreta para acceder al contenido de estos trabajos.

Para facilitar la resolución de problemas y la clasificación, sincroniza el índice de empleos de Cloud Talent Solution con el tuyo y mantén una relación entre el name generado por Cloud Talent Solution y el identificador de empleo único de tu sistema. A medida que los trabajos cambien o se introduzcan en tu sistema, se debe enviar la llamada CRUD adecuada a Cloud Talent Solution en tiempo real para que estos cambios se reflejen inmediatamente. El índice de Cloud Talent Solution debe añadirse a la canalización de ingestión de ofertas de empleo.

Crear una tarea

Para crear un empleo, consulta la guía de inicio rápido para crear empresas y empleos.

Java

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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
}

Campos obligatorios

Los siguientes campos son obligatorios durante la creación y la actualización de un trabajo:

  • companyName: nombre del recurso de la empresa que publica el trabajo, como projects/[PROJECT_ID]/companies/[COMPANY_ID].

  • requisitionId: ID de solicitud, también denominado ID de publicación, asignado por el cliente para identificar un empleo. Los clientes deben usar este campo para identificarse y hacer un seguimiento de las solicitudes. El número máximo de caracteres permitidos es 225.

    La singularidad de una oferta de empleo se determina mediante una combinación de requisitionID, companyName y la configuración regional del empleo. Si se crea un trabajo con una clave específica de estos atributos, esta clave se almacena en el índice de Cloud Talent Solution y no se pueden crear otros trabajos con estos mismos campos hasta que se elimine el trabajo.

  • title: el título del puesto, como "Ingeniero de software". El número máximo de caracteres permitidos es 500.

    Para solucionar el problema de los resultados de búsqueda perdidos debido a los títulos de trabajo no estándar, Cloud Talent Solution aprovecha todos los campos proporcionados en el trabajo para comprender el contexto del trabajo y almacenar internamente un título "limpio" del trabajo. Cuando se envía una solicitud de búsqueda al servicio, también se limpia la consulta de búsqueda y se usan las ontologías para asignar la consulta limpia a los trabajos limpios relevantes.

  • description: descripción del puesto, que suele incluir una descripción de la empresa de varios párrafos e información relacionada. En el objeto de trabajo se proporcionan campos independientes para las responsabilidades, las cualificaciones y otras características del puesto. Se recomienda el uso de estos campos de empleo independientes.

    Este campo acepta y desinfecta la entrada HTML, así como las etiquetas de marcado de texto en negrita, cursiva, listas ordenadas y listas sin ordenar. Se admite un máximo de 100.000 caracteres.

Uno de los siguientes:

  • applicationInfo.uris[]: las URLs de las páginas de la aplicación.

  • applicationInfo.emails[]: dirección o direcciones de correo a las que se deben enviar los currículums o las solicitudes.

  • applicationInfo.instruction: instrucciones de la solicitud, como "Envía tu solicitud por correo a ...". Este campo acepta y depura la entrada HTML, así como las etiquetas de marcado de texto en negrita, cursiva, listas ordenadas y listas sin ordenar. El número máximo de caracteres permitidos es 3000.

Campos de uso habitual

  • postingExpireTime: hora, basada en la marca de tiempo, en la que vence la publicación del empleo. Cuando llegue esa hora, el trabajo se marcará como caducado y no aparecerá en los resultados de búsqueda. Esta fecha debe ser anterior al 31/12/2100 en la zona horaria UTC. Las fechas no válidas (como las anteriores) se ignoran. La fecha predeterminada en la que caduca el trabajo es 30 días después de la hora de creación del trabajo en la zona horaria UTC.

    El contenido de los trabajos caducados se puede recuperar hasta 60 días después de que caduquen mediante el operador GET. Una vez transcurrido este plazo de 60 días, el trabajo no se devolverá mediante una operación GET.

  • addresses[]: ubicaciones en las que se está contratando para el puesto. Se recomienda proporcionar la dirección completa de la calle de la ubicación de contratación para obtener mejores resultados de la API, incluidas las búsquedas de empleo por tiempo de desplazamiento. El número máximo de caracteres permitido es 500. Puedes consultar más información sobre addresses[] en la sección Prácticas recomendadas que aparece más abajo.

  • promotionValue: un valor superior a 0 define este trabajo como "trabajo destacado", que solo se devuelve en búsquedas de trabajo de tipo FEATURED_JOBS. Los valores más altos se devuelven en los primeros puestos de los resultados de búsqueda destacados. Consulta Empleos destacados para obtener más información.

Campos personalizados

  • customAttributes: este campo almacena hasta 100 atributos personalizados que se usan para almacenar datos personalizados sobre el trabajo. Estos campos se pueden filtrar mediante una solicitud de búsqueda que especifique el campo jobQuery de una solicitud de búsqueda de empleo. Además, cualquiera de estos campos se puede definir en el atributo keywordSearchableJobCustomAttributes de la empresa, de modo que un término de búsqueda que tenga una concordancia exacta en cualquiera de los campos de keywordSearchableJobCustomAttributes devuelva cualquier trabajo que incluya la concordancia.

Actualizar una tarea

Actualizar un trabajo sin fieldMask

Java

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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
}

Actualizar tarea con fieldMask

Java

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Talent Solution, consulta las bibliotecas de cliente de 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
}

Prácticas recomendadas

Campos de ubicación

Siempre que sea posible, te recomendamos que proporciones la dirección de la calle de un empleo en el campo addresses[]. Esto ayuda a detectar la ubicación y la relevancia. Si no hay una dirección a nivel de calle, introduzca toda la información que pueda. Se admiten direcciones hasta el nivel de país. No se admiten las designaciones de regiones (como "Noroeste del Pacífico").

Cloud Talent Solution usa los datos del campo addresses[] para rellenar el campo derivedInfo.locations[] (solo de salida). Cuando no se proporciona una dirección completa, el servicio usa otras señales, como el nombre de la empresa, para determinar si se puede inferir una dirección más completa para la oferta de empleo.

Por ejemplo, si la ubicación de un empleo de software es Mountain View, y la empresa a la que está asociado el empleo es Google, el servicio busca el objeto de la empresa para ver si se proporciona una dirección más precisa en el campo headquartersAddress y si esa dirección está en la misma ciudad que la oferta de empleo. Si es así, el servicio entiende que el trabajo "probablemente" se realice en esa dirección y rellena el campo derivedInfo.locations[] de forma adecuada.

Si no hay datos de la dirección de la empresa, el servicio usa una combinación de conocimientos propios e información sobre el puesto o la empresa para rellenar el campo derivedInfo.locations[].

Dado que el valor de derivedInfo.locations[] es una estimación, puede usar los datos de derivedInfo.locations[] o el campo addresses al mostrar la dirección del trabajo.

Una oferta de empleo puede tener asociadas un máximo de 50 ubicaciones. Si un puesto tiene más ubicaciones, puedes dividirlo en varios puestos, cada uno con un requisitionId único (por ejemplo, "ReqA", "ReqA-1", "ReqA-2", etc.), ya que no se permite tener varios puestos con el mismo requisitionId, companyName y languageCode. Si se debe conservar el requisitionId original, se debe usar un CustomAttribute para el almacenamiento. Te recomendamos que agrupes las ubicaciones más cercanas entre sí en el mismo trabajo para disfrutar de una mejor experiencia de búsqueda.

Direcciones admitidas

Cloud Talent Solution acepta cualquier dirección que reconozca la API Geocoding de Google Maps (en el campo formattedAddress). El servicio devuelve un error 400 si intentas crear un trabajo o ejecutar una búsqueda con una dirección no reconocida.

Si la dirección de una empresa aparece incorrectamente en la API Geocoding de Google Maps, informa de un error para que se corrija. Las correcciones pueden tardar hasta 5 días en aplicarse.

Autocompletado de direcciones

Cloud Talent Solution no ofrece sugerencias de autocompletado para las ubicaciones. Usa la API Places de Google Maps u otros servicios de ubicación similares para rellenar las sugerencias de autocompletado.

Empleos en todo el estado, en todo el país y de teletrabajo

Los trabajos se pueden especificar como estatales, nacionales o de teletrabajo mediante el campo postingRegion del recurso Job.

  • Los trabajos de ADMINISTRATIVE_AREA y NATION se devuelven en cualquier búsqueda cuya ubicación se encuentre en el estado o país de la oferta de empleo. Por ejemplo, si un trabajo de ADMINISTRATIVE_AREA tiene la ubicación "WA, USA", se devuelve en las búsquedas cuyo LocationFilter especifica "Seattle".

  • TELECOMMUTE se devuelven en cualquier búsqueda relacionada con la ubicación, pero se consideran menos relevantes. Se pueden segmentar en una búsqueda configurando la marca telecommutePreference en TELECOMMUTE_ALLOWED en el elemento LocationFilter de la búsqueda.