職缺基本介紹 (v3)

一個「職缺」資源代表一則職缺公告 (亦稱為「徵才資訊」或「工作申請」)。職缺屬於公司,即負責該職缺的聘僱實體。

您可以使用建立、更新和刪除等方法來操作職缺,以及使用列表和取得等方法來存取職缺。Cloud Talent Solution 索引最多可能需要五分鐘才能讓這些變更生效。

職缺位於服務帳戶的範圍內。只有透過特定服務帳戶的憑證完成驗證的搜尋要求,才能用來存取這些職缺的內容。

為了方便進行疑難排解與錯誤分級,請讓 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 輸入,也接受粗體、斜體、已排序清單和未排序清單標記標籤。允許的字元數上限為 100,000 個字元。

可以是下列其中一項:

  • applicationInfo.uris[]:申請頁面的網址。

  • applicationInfo.emails[]:履歷或申請函的電子郵件收件地址。

  • applicationInfo.instruction:申請說明,例如「請將您的申請寄至...」。此欄位可接受並處理 HTML 輸入,也接受粗體、斜體、已排序清單和未排序清單標記標籤。允許的字元數上限為 3,000 個字元。

常用欄位

  • postingExpireTime:職缺公告的到期時間,以時間戳記為準。 時間到之後,服務會將職缺標記為到期,到期的職缺不會出現在搜尋結果中。此日期應在世界標準時間 (UTC) 2100/12/31 之前。 服務會忽略無效的日期 (如過去的日期)。預設的到期日為職缺建立後的 30 天 (使用世界標準時間)。

    職缺到期後的 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 個相關聯的地點。如果職缺的地點超過此數目,您可以將這個職缺拆成多個職缺,每個職缺都有一個唯一的 requisitionId (如「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 職缺。例如,如果有一個 ADMINISTRATIVE_AREA 職缺的地點為「美國華盛頓州」,當您將 LocationFilter 指定為「西雅圖」進行搜尋時,將會傳回該職缺。

  • 任何與地點相關的搜尋都會傳回 TELECOMMUTE 職缺,但關聯性較低。telecommutePreference 標記設為 TELECOMMUTE_ALLOWED,即可在搜尋的 LocationFilter 中指定這類職缺。