Implementa la búsqueda por viaje diario en tu IU

Puede integrar la búsqueda por viaje diario en su IU para permitir que los buscadores de trabajo busquen trabajo dentro de un área geográfica establecida por tiempo de viaje. La búsqueda por viaje diario estima el tiempo de viaje en función del modo de tránsito seleccionado por el usuario y la hora del día en que planea viajar.

  1. Antes de que pueda implementar la búsqueda por viaje diario, Cloud Talent Solution debe estar conectado a su IU. Sigue la guía de inicio rápido <atarget="_blank" class="external" l10n-attrs-original-order="href,target,class" l10n-encrypted-href="gMBmW1CJpUkqBwsc6X45vJFGBtNXMtSEozqMDCbrBLAVTmdE5Zm3DKcU3qbzRuF6frX41+aqUsjT+LI1UDeMrcClLjr70YAKyEYUijrkHsg="> para configurar Cloud Talent Solution.</atarget="_blank">

  2. La búsqueda por viaje diario usa los datos de dirección que cargaste con tus trabajos durante la implementación de CTS para calcular el tiempo de viaje. Para habilitar esta función en tu IU de CTS existente, envía una solicitud jobs.search y, además, incluye un objeto CommuteFilter en el campo JobQuery.commuteFilter. commuteMethod, travelDuration, startCoordinates, y roadTraffic o departureTime son campos obligatorios.

Go

Para aprender a instalar y usar la biblioteca cliente de CTS, consulta Bibliotecas cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API de Go de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

import (
	"context"
	"fmt"
	"io"

	talent "cloud.google.com/go/talent/apiv4beta1"
	"cloud.google.com/go/talent/apiv4beta1/talentpb"
	"github.com/golang/protobuf/ptypes/duration"
	"google.golang.org/genproto/googleapis/type/latlng"
)

// commuteSearch searches for jobs within commute filter.
func commuteSearch(w io.Writer, projectID, companyID string) error {
	ctx := context.Background()

	// Initialize a jobService client.
	c, err := talent.NewJobClient(ctx)
	if err != nil {
		return fmt.Errorf("talent.NewJobClient: %w", err)
	}
	defer c.Close()

	// Construct a jobQuery request with a commute filter.
	jobQuery := &talentpb.JobQuery{
		CommuteFilter: &talentpb.CommuteFilter{
			CommuteMethod:  talentpb.CommuteMethod_TRANSIT,
			TravelDuration: &duration.Duration{Seconds: 1800},
			StartCoordinates: &latlng.LatLng{
				Latitude:  37.422408,
				Longitude: -122.085609,
			},
		},
	}
	if companyID != "" {
		jobQuery.Companies = []string{fmt.Sprintf("projects/%s/companies/%s", projectID, companyID)}
	}

	// Construct a searchJobs request with a jobQuery.
	req := &talentpb.SearchJobsRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		// Make sure to set the RequestMetadata the same as the associated
		// search request.
		RequestMetadata: &talentpb.RequestMetadata{
			// Make sure to hash your userID.
			UserId: "HashedUsrID",
			// Make sure to hash the sessionID.
			SessionId: "HashedSessionID",
			// Domain of the website where the search is conducted.
			Domain: "www.googlesample.com",
		},
		// Set the actual search term as defined in the jobQuery.
		JobQuery: jobQuery,
	}

	resp, err := c.SearchJobs(ctx, req)
	if err != nil {
		return fmt.Errorf("SearchJobs: %w", err)
	}

	for _, job := range resp.GetMatchingJobs() {
		fmt.Fprintf(w, "Matcing Job: %q\n", job.GetJob().GetName())
		fmt.Fprintf(w, "Job address: %v\n", job.GetCommuteInfo().GetJobLocation().GetPostalAddress().GetAddressLines())
	}

	return nil
}

Java

Para aprender a instalar y usar la biblioteca cliente de CTS, consulta Bibliotecas cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API de Java de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


import com.google.cloud.talent.v4.CommuteFilter;
import com.google.cloud.talent.v4.CommuteMethod;
import com.google.cloud.talent.v4.Job;
import com.google.cloud.talent.v4.JobQuery;
import com.google.cloud.talent.v4.JobServiceClient;
import com.google.cloud.talent.v4.RequestMetadata;
import com.google.cloud.talent.v4.SearchJobsRequest;
import com.google.cloud.talent.v4.SearchJobsResponse;
import com.google.cloud.talent.v4.TenantName;
import com.google.protobuf.Duration;
import com.google.type.LatLng;
import java.io.IOException;

public class CommuteSearchJobs {

  public static void searchJobs() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String tenantId = "your-tenant-id";
    searchJobs(projectId, tenantId);
  }

  // Search Jobs with histogram queries.
  public static void searchJobs(String projectId, String tenantId) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient jobServiceClient = JobServiceClient.create()) {
      TenantName parent = TenantName.of(projectId, tenantId);
      String domain = "www.example.com";
      String sessionId = "Hashed session identifier";
      String userId = "Hashed user identifier";
      RequestMetadata requestMetadata =
          RequestMetadata.newBuilder()
              .setDomain(domain)
              .setSessionId(sessionId)
              .setUserId(userId)
              .build();

      CommuteMethod commuteMethod = CommuteMethod.DRIVING;
      long seconds = 3600L;
      Duration travelDuration = Duration.newBuilder().setSeconds(seconds).build();

      double latitude = 37.422408;
      double longitude = -122.084068;
      LatLng startCoordinates =
          LatLng.newBuilder().setLatitude(latitude).setLongitude(longitude).build();

      CommuteFilter commuteFilter =
          CommuteFilter.newBuilder()
              .setCommuteMethod(commuteMethod)
              .setTravelDuration(travelDuration)
              .setStartCoordinates(startCoordinates)
              .build();

      JobQuery jobQuery = JobQuery.newBuilder().setCommuteFilter(commuteFilter).build();
      SearchJobsRequest request =
          SearchJobsRequest.newBuilder()
              .setParent(parent.toString())
              .setRequestMetadata(requestMetadata)
              .setJobQuery(jobQuery)
              .build();

      for (SearchJobsResponse.MatchingJob responseItem :
          jobServiceClient.searchJobs(request).getMatchingJobsList()) {
        System.out.format("Job summary: %s%n", responseItem.getJobSummary());
        System.out.format("Job title snippet: %s%n", responseItem.getJobTitleSnippet());
        Job job = responseItem.getJob();
        System.out.format("Job name: %s%n", job.getName());
        System.out.format("Job title: %s%n", job.getTitle());
      }
    }
  }
}

Node.js

Para aprender a instalar y usar la biblioteca cliente de CTS, consulta Bibliotecas cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API de Node.js de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


const talent = require('@google-cloud/talent').v4;

/** Search Jobs using commute distance */
function sampleSearchJobs(projectId, tenantId) {
  const client = new talent.JobServiceClient();
  // Iterate over all elements.
  // const projectId = 'Your Google Cloud Project ID';
  // const tenantId = 'Your Tenant ID (using tenancy is optional)';
  const formattedParent = client.tenantPath(projectId, tenantId);
  const domain = 'www.example.com';
  const sessionId = 'Hashed session identifier';
  const userId = 'Hashed user identifier';
  const requestMetadata = {
    domain: domain,
    sessionId: sessionId,
    userId: userId,
  };
  const commuteMethod = 'TRANSIT';
  const seconds = 1800;
  const travelDuration = {
    seconds: seconds,
  };
  const latitude = 37.422408;
  const longitude = 122.084068;
  const startCoordinates = {
    latitude: latitude,
    longitude: longitude,
  };
  const commuteFilter = {
    commuteMethod: commuteMethod,
    travelDuration: travelDuration,
    startCoordinates: startCoordinates,
  };
  const jobQuery = {
    commuteFilter: commuteFilter,
  };
  const request = {
    parent: formattedParent,
    requestMetadata: requestMetadata,
    jobQuery: jobQuery,
  };

  client
    .searchJobs(request)
    .then(responses => {
      const resources = responses[0];
      for (const resource of resources) {
        console.log(`Job summary: ${resource.jobSummary}`);
        console.log(`Job title snippet: ${resource.jobTitleSnippet}`);
        const job = resource.job;
        console.log(`Job name: ${job.name}`);
        console.log(`Job title: ${job.title}`);
      }
    })
    .catch(err => {
      console.error(err);
    });
}

Python

Para aprender a instalar y usar la biblioteca cliente de CTS, consulta Bibliotecas cliente de CTS. Para obtener más información, consulta la documentación de referencia de la API de Python de CTS.

Para autenticarte en CTS, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


from google.cloud import talent

def search_jobs(project_id, tenant_id):
    """Search Jobs using commute distance"""

    client = talent.JobServiceClient()

    # project_id = 'Your Google Cloud Project ID'
    # tenant_id = 'Your Tenant ID (using tenancy is optional)'

    if isinstance(project_id, bytes):
        project_id = project_id.decode("utf-8")
    if isinstance(tenant_id, bytes):
        tenant_id = tenant_id.decode("utf-8")
    parent = f"projects/{project_id}/tenants/{tenant_id}"
    domain = "www.example.com"
    session_id = "Hashed session identifier"
    user_id = "Hashed user identifier"
    request_metadata = talent.RequestMetadata(
        domain=domain, session_id=session_id, user_id=user_id
    )
    commute_method = talent.CommuteMethod.TRANSIT
    seconds = 1800
    travel_duration = {"seconds": seconds}
    latitude = 37.422408
    longitude = -122.084068
    start_coordinates = {"latitude": latitude, "longitude": longitude}
    commute_filter = talent.CommuteFilter(
        commute_method=commute_method,
        travel_duration=travel_duration,
        start_coordinates=start_coordinates,
    )
    job_query = talent.JobQuery(commute_filter=commute_filter)

    # Iterate over all results
    results = []
    request = talent.SearchJobsRequest(
        parent=parent,
        request_metadata=request_metadata,
        job_query=job_query,
    )
    for response_item in client.search_jobs(request=request).matching_jobs:
        print(f"Job summary: {response_item.job_summary}")
        print(f"Job title snippet: {response_item.job_title_snippet}")
        job = response_item.job
        results.append(job.name)
        print(f"Job name: {job.name}")
        print(f"Job title: {job.title}")
    return results

Recomendaciones de IU

  1. Cloud Talent Solution no permite la búsqueda por distancia (mediante el filtro de ubicación del CTS) y por tiempo de viaje diario en la misma llamada a la API. Para permitir que los usuarios que buscan empleo accedan a ambas opciones, use un enfoque de 2 pestañas o similar.

  2. Modifica el frontend de tu aplicación para asegurarte de que el backend propague de forma automática la información relevante del usuario en el filtro de viaje diario. El backend debe llamar a la API como lo haría en una solicitud de búsqueda normal.

  3. Incluya los siguientes elementos en su interfaz de usuario:

    • Una opción para seleccionar una búsqueda según la distancia o una búsqueda según el viaje diario. Por ejemplo, tu IU de búsqueda podría verse como el ejemplo que se muestra a continuación:

    • Un menú desplegable de opciones de método de viaje diario.

    • Una opción para ajustar las condiciones del tráfico.

    • El tiempo total de viaje (el tiempo de viaje máximo admitido es de 60 minutos).

    • Hora de inicio del viaje.

  4. La información de tiempo de viaje que se muestra desde la API se usa para mostrarle información al solicitante de trabajo. Solo los trabajos relevantes ubicados dentro del área designada de tiempo de viaje se muestran en la lista de resultados. Consulte la documentación de Búsqueda de trabajo prácticas recomendadas para ver un análisis sobre las formas de ajustar el orden y la cantidad de trabajos que se muestran dentro de esta área.

  5. Los resultados de la búsqueda por trayecto diario se basan en datos históricos y agregados en lugar de condiciones de tráfico en vivo. Las condiciones de tráfico departureTime se calculan a partir de las condiciones de tráfico promedio a la hora especificada del día. Las opciones BUSY_HOUR y TRAFFIC_FREE en roadTraffic son condiciones de tráfico promedio en la hora pico de la mañana y en la medianoche, de forma respectiva. Los usuarios reciben los mismos resultados de búsqueda de viaje sin importar a qué hora del día envíen una consulta.

Puede aprovechar Google Maps para generar un mapa basado en la información del tiempo de viaje que muestra CTS e incorporarlo en los resultados que muestra a un solicitante de trabajo. El paquete de la API de Google Maps tiene varias opciones para mostrar un mapa. Algunas opciones de la API de Google Maps son más efectivas que otras. Por ejemplo, la visualización de mapas de calor de JavaScript de Google Maps combinada con el agrupamiento en clústeres de marcadores es una excelente manera de visualizar los trabajos relevantes que se le muestran a un solicitante de trabajo dentro del área determinada por sus preferencias de viaje establecidas. Por el contrario, el Modo de instrucciones no muestra todos los trabajos de una solicitud de búsqueda y no es una opción recomendada.

Para obtener más información sobre la implementación de una búsqueda basada en el viaje, consulta la guía práctica de la búsqueda por viaje diario.