招聘信息基础知识 (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

C#

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


public static Job CreateJob(Job jobToBeCreated)
{
    try
    {
        CreateJobRequest createJobRequest = new CreateJobRequest();
        createJobRequest.Job = jobToBeCreated;

        Job jobCreated = jobServiceClient.Projects.Jobs.Create(createJobRequest, parent).Execute();
        Console.WriteLine("Job created: " + jobCreated.Name);
        return jobCreated;
    }
    catch (Exception e)
    {
        Console.WriteLine("Got exception while creating job");
        throw 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: %v", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %v", 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: %v", jobToCreate.RequisitionId, err)
	}
	return job, err
}

Node.js

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


/**
 * Create a job.
 */
const createJob = async (jobServiceClient, jobToBeCreated) => {
  try {
    const request = {
      parent: `projects/${PROJECT_ID}`,
      resource: {
        job: jobToBeCreated,
      },
    };

    const jobCreated = await jobServiceClient.projects.jobs.create(request);

    console.log(`Job created: ${JSON.stringify(jobCreated.data)}`);
    return jobCreated.data;
  } catch (e) {
    console.error(`Got exception while creating job!`);
    throw e;
  }
};

Ruby

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库

# project_id         = "Id of the project"
# job_to_be_created  = "Job to be created"

require "google/apis/jobs_v3"

jobs = Google::Apis::JobsV3

talent_solution_client = jobs::CloudTalentSolutionService.new
talent_solution_client.authorization = Google::Auth.get_application_default(
  "https://www.googleapis.com/auth/jobs"
)

begin
  create_job_request = jobs::CreateJobRequest.new job: job_to_be_created
  job_created = talent_solution_client.create_job project_id, create_job_request
  puts "Job created: #{job_created.to_json}"
  return job_created
rescue StandardError => e
  puts "Exception occurred while creating job: #{e}"
end

必需的字段

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

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

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

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

  • title:职位的职称,如“软件工程师”允许的最大字符数为 3000。

    为了解决因招聘信息名称不标准而漏掉搜索结果的问题,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

C#

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


public static Job UpdateJob(string jobName, Job toBeUpdated)
{
    try
    {
        UpdateJobRequest updateJobRequest = new UpdateJobRequest()
        {
            Job = toBeUpdated
        };
        Job jobUpdated = jobServiceClient.Projects.Jobs.Patch(updateJobRequest, jobName).Execute();
        Console.WriteLine("Job updated: " + ToJsonString(jobUpdated));
        return jobUpdated;
    }
    catch (Exception e)
    {
        Console.WriteLine("Got exception while updating job");
        throw 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: %v", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %v", 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: %v", jobName, err)
	}

	return job, err
}

Node.js

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


/**
 * Update a job.
 */
const updateJob = async (jobServiceClient, jobName, jobToBeUpdated) => {
  try {
    const request = {
      name: jobName,
      resource: {
        job: jobToBeUpdated,
      },
    };

    const jobUpdated = await jobServiceClient.projects.jobs.patch(request);

    console.log(`Job updated: ${JSON.stringify(jobUpdated.data)}`);
    return jobUpdated.data;
  } catch (e) {
    console.error(`Got exception while updating job!`);
    throw e;
  }
};

Ruby

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库

# job_name     = "The name of the job you want to update"
# job_to_be_updated  = "The new job object to be updated"
require "google/apis/jobs_v3"

jobs = Google::Apis::JobsV3

talent_solution_client = jobs::CloudTalentSolutionService.new
talent_solution_client.authorization = Google::Auth.get_application_default(
  "https://www.googleapis.com/auth/jobs"
)

begin
  update_job_request = jobs::UpdateJobRequest.new job: job_to_be_updated
  job_updated = talent_solution_client.patch_project_job job_name, update_job_request
  puts "Job updated: #{job_updated.to_json}"
  return job_updated
rescue StandardError => e
  puts "Exception occurred while updating job: #{e}"
end

更新含 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

C#

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


public static Job UpdateJobWithFieldMask(string jobName, string fieldMask, Job jobToBeUpdated)
{
    try
    {
        UpdateJobRequest updateJobRequest = new UpdateJobRequest()
        {
            Job = jobToBeUpdated,
            UpdateMask = fieldMask
        };

        Job jobUpdated = jobServiceClient.Projects.Jobs.Patch(updateJobRequest, jobName).Execute();
        Console.WriteLine("Job updated with fieldMask: " + ToJsonString(jobUpdated));
        return jobUpdated;
    }
    catch (Exception e)
    {
        Console.WriteLine("Got exception while updating job with field mask");
        throw 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: %v", err)
	}
	// Create the jobs service client.
	service, err := talent.New(client)
	if err != nil {
		return nil, fmt.Errorf("talent.New: %v", 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
}

Node.js

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库


/**
 * Update a job with field mask.
 */
const updateJobWithFieldMask = async (
  jobServiceClient,
  jobName,
  jobToBeUpdated,
  fieldMask
) => {
  try {
    const request = {
      name: jobName,
      resource: {
        job: jobToBeUpdated,
        updateMask: fieldMask,
      },
    };

    const jobUpdated = await jobServiceClient.projects.jobs.patch(request);

    console.log(`Job updated: ${JSON.stringify(jobUpdated.data)}`);
    return jobUpdated.data;
  } catch (e) {
    console.error(`Got exception while updating job with field mask!`);
    throw e;
  }
};

Ruby

如需详细了解如何安装和创建 Cloud Talent Solution 客户端,请参阅 Cloud Talent Solution 客户端库

# job_name     = "The name of the job you want to update"
# field_mask   = "The field mask you want to update"
# job_updated  = "The new job object to be updated"

require "google/apis/jobs_v3"

jobs = Google::Apis::JobsV3

talent_solution_client = jobs::CloudTalentSolutionService.new
talent_solution_client.authorization = Google::Auth.get_application_default(
  "https://www.googleapis.com/auth/jobs"
)

begin
  update_job_request = jobs::UpdateJobRequest.new job:         job_to_be_updated,
                                                  update_mask: field_mask
  job_updated = talent_solution_client.patch_project_job job_name, update_job_request
  puts "Job updated with filedMask #{update_job_request.update_mask}. "
  puts "Updated job: #{job_updated.to_json}"
  return job_updated
rescue StandardError => e
  puts "Exception occurred while updating job with field mask: #{e}"
end

最佳做法

地点字段

我们建议您尽可能在 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 来搜索这类职位。