招聘信息基础知识 (v3)

招聘信息资源表示招聘信息帖子(也称为“职位列表”或“雇用信息”)。招聘信息属于公司,公司是负责该招聘信息的雇用实体。

招聘信息可通过 create、update 和 deletion 方法操控,并使用 list 和 get 方法访问。如果发生更改,Cloud Talent Solution 索引最长可能需要 5 分钟才能反映这些更改。

职位包含在服务账号的范围内。只有使用特定服务账号的凭据经过身份验证的搜索请求,才能用于访问这些招聘信息的内容。

为了便于排查问题和分类,请将 Cloud Talent Solution 职位索引与您自己的职位索引同步,并维护 Cloud Talent Solution 生成的 name 与系统中唯一的职位标识符之间的关系。当招聘信息发生变更或是被引入您的系统时,应将相应的 CRUD 调用实时发送到 Cloud Talent Solution,以确保这些变更能够立即反映。必须将 Cloud Talent Solution 索引添加到现有招聘信息提取管道。

创建职位

要创建招聘信息,请参阅快速入门:创建公司和招聘信息指南获取详情。

Java

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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
}

必填字段

创建和更新招聘信息期间必须填写以下字段:

  • companyName:用于列出招聘信息的公司的资源名称,例如 projects/[PROJECT_ID]/companies/[COMPANY_ID]

  • requisitionId:雇用信息 ID,也称为帖子 ID,由客户指定以标识招聘信息。客户使用此字段来标识自己并跟踪申请。允许的字符数上限为 225。

    招聘信息的 requisitionIDcompanyName 和语言区域的组合确定了招聘信息帖子的唯一性。如果使用这些属性的特定键创建职位,则该键将存储在 Cloud Talent Solution 索引中。在该职位删除之前,无法使用这些相同的字段创建其他职位。

  • title:职位的职称,如“软件工程师”允许的字符数上限为 500。

    为了解决因招聘信息名称不标准而漏掉搜索结果的问题,Cloud Talent Solution 利用招聘信息中提供的所有字段来理解招聘信息的背景,并在内部存储招聘信息的“干净”名称。在向服务发送搜索请求时,系统也会清理搜索查询,并使用本体将清理后的查询映射到相关的清理版职位。

  • description:职位的描述,通常包括对公司的多段描述和相关信息。对于职位对象,还提供了单独的字段,如职责、资质和其他职位特性等。建议使用这些单独的字段。

    此字段接受并清理 HTML 输入,也接受粗体、斜体、有序列表和无序列表标识标记。 允许的最大字符数为 100000。

如下所示:

常用字段

  • postingExpireTime:招聘信息到期的时间,以时间戳为准。到期后,招聘信息将标记为已过期,并且不会在搜索结果中显示。 此日期应早于世界协调时间 (UTC) 时区的 2100/12/31。 无效日期(例如过去的日期)将被忽略。 招聘信息的默认到期日期是创建后的 30 天,采用世界协调时间 (UTC) 时区。

    在招聘信息到期后的 60 天内,仍然可以通过 GET 运算符检索其内容。60 天截止日期之后,便无法再通过 GET 操作检索到该招聘信息。

  • addresses[]:职位的雇用地点。建议提供雇用地点的完整街道地址,以获得更好的 API 结果,包括按通勤时间搜索招聘信息。允许的字符数上限为 500。如需详细了解 addresses[],请参阅下面的最佳做法部分。

  • promotionValue:设置大于 0 的值会将此职位定义为“精选职位”,此类职位仅在类型为 FEATURED_JOBS 的职位搜索中返回。返回的值越大,该职位在精选职位搜索结果中的位置就越靠前。如需了解详情,请参阅精选职位

自定义字段

  • customAttributes:此字段最多可存储 100 个自定义属性,用于存储职位的自定义数据。可以在招聘信息搜索请求中指定 jobQuery 字段来过滤这些字段。此外,任何一个字段都可以在公司的 keywordSearchableJobCustomAttributes 属性中设置,以便在搜索字词与 keywordSearchableJobCustomAttributes 中的任何字段完全匹配时,返回所有包含此匹配项的职位。

更新招聘信息

更新不含 fieldMask 的招聘信息

Java

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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
}

更新含 fieldMask 的招聘信息

Java

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 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
}

最佳实践

地点字段

我们建议您尽可能在 addresses[] 字段中提供职位的街道地址。这有助于位置检测和相关性匹配。如果无法提供街道地址,请输入尽可能多的信息。 最高支持国家/地区级别的地址。 不支持区域名称(例如“太平洋西北地区”)。

Cloud Talent Solution 使用 addresses[] 字段中的数据填充(仅限输出)derivedInfo.locations[] 字段。如果未提供完整地址,则服务会通过其他信息(例如公司名称)来确定是否能为招聘信息帖子推断出更完整的地址。

例如,如果软件职位的地点被指定为 Mountain View,并且与该职位相关联的公司是 Google,该服务会查找公司对象,以查看在 headquartersAddress 字段中是否提供了更好的街道地址,以及该街道地址是否与招聘信息位于同一个城市。如果是,服务会理解为该职位的工作地点“可能”是在该街道地址并相应地填写 derivedInfo.locations[] 字段。

如果公司地址数据不可用,服务会结合专有知识和招聘信息/公司信息来填写 derivedInfo.locations[] 字段。

由于 derivedInfo.locations[] 值是尽力猜测出的结果,因此在显示职位地址时,您可能需要使用 derivedInfo.locations[] 数据或 addresses 字段。

招聘信息帖子的关联位置不得超过 50 个。如果超过这个限制,您可以将招聘信息拆分为多个,每个分配一个唯一的 requisition_id(例如“ReqA”、“ReqA-1”、“ReqA-2”等),因为系统不允许多个招聘信息使用相同的 requisitionIdcompanyNamelanguageCode。如果必须保留原始 requisitionId,则应使用 CustomAttribute 进行存储。建议您将距离最近的位置组合归入同一招聘信息,以提供更好的搜索体验。

支持的地址

Cloud Talent Solution 接受 Google Maps Geocoding API 可识别的任何地址(在 formattedAddress 字段中)。如果您尝试使用无法识别的地址创建职位或执行搜索,服务会返回 400 错误。

如果 Google Maps Geocoding API 中所列的办公地址不正确,请提交错误以便相关人员更正。更正的地址可能需要 5 天才能生效。

地址自动填充

Cloud Talent Solution 不提供位置的自动填充建议。 使用 Google Maps Places API 或其他类似的位置服务来填充自动填充建议。

全州、全国和远程办公招聘信息

可以使用招聘信息资源的 postingRegion 字段指定全州、全国或远程办公。

  • 如果搜索的工作地点在招聘信息帖子的州/国家范围内,系统将返回 ADMINISTRATIVE_AREANATION 招聘信息。例如,如果搜索时将 LocationFilter 指定为“西雅图”,则返回结果中也会包含工作地点为“美国华盛顿州”的 ADMINISTRATIVE_AREA 职位。

  • 所有与位置相关的搜索都会返回 TELECOMMUTE 职位,但这些职位会被视为相关性较低。可以通过在搜索的 LocationFilter 中将 telecommutePreference 标志设置为 TELECOMMUTE_ALLOWED 来搜索这类职位。