Google Cloud로 Job Search API 쿼리

이 Codelab에서는 Cloud Talent Solution API(CTS)를 사용하여 조직의 채용정보 검색 및 인재 채용을 개선하는 방법을 알아봅니다. CTS를 사용하면 머신러닝의 기능을 취업정보 검색 환경에 추가할 수 있습니다.

학습할 내용

  • Google Cloud 프로젝트에서 CTS 사용 설정
  • Job Search API를 사용하여 채용 정보 쿼리

필요한 항목

본 가이드를 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다 읽은 다음 실습 활동을 완료할 계획입니다

Google Cloud Platform 이전 경험이 어떠셨나요?

초급 중급 전문가

이 튜토리얼은 Google Cloud Platform에서 완전히 실행되도록 작성되었습니다. 워크스테이션에 다운로드할 필요가 없습니다.

Cloud Talent Solutions API 사용 설정

Cloud Console에서 애플리케이션을 열고 왼쪽 상단에서 햄버거 메뉴를 클릭합니다. Talent Solution -> 개요 메뉴를 확인합니다.

새로운 프로젝트이므로 API 사용 설정을 요청하는 새 화면으로 리디렉션됩니다. 사용 설정을 클릭하고 이 프로젝트에서 API가 사용 설정될 때까지 몇 분 정도 기다립니다.

데이터 로깅 사용 설정하기

이제 이전 개요 페이지로 돌아갑니다. 데이터 로깅을 사용 설정할 것인지 묻는 대화상자가 나타납니다. 이는 취업정보 검색 API가 데이터를 필요로 하는 머신러닝 모델을 기반으로 한다는 사실만을 의미합니다. 통합의 일환으로 이러한 모델을 추가로 학습시키기 위해 검색하는 사용자의 이벤트를 전송할 수 있습니다. 코드를 통해 이를 구현할 때 어떤 정보를 전송할지 지정할 수 있습니다.

이러한 이벤트에 대해 자세히 알아보고 나중에 보내는 방법을 자세히 살펴보겠습니다. 하지만 선행 학습된 모델은 문제없이 작동합니다. 데이터 로깅을 사용 설정한 후 이 대화상자의 왼쪽 탐색 메뉴에서 '서비스 계정 연결'을 클릭합니다.

서비스 계정 설정

API 요청을 할 때 실제 인증된 계정을 대신하여 요청해야 합니다. Google Cloud Platform의 권장사항을 따르는 서비스 계정을 설정하는 것이 좋습니다. 서비스 계정을 권한이 제한된 인증된 사용자를 설정하는 간편한 방법이라고 생각해 보세요. 이를 통해 독립적인 안전한 시스템을 구축할 수 있습니다.

예를 들어 Job Search API를 사용하려면 서비스 계정이 필요합니다. 만들어 보세요! 페이지 상단에서 "서비스 계정 연결 왼쪽 메뉴의 'Cloud Talent Solution' 섹션에서 'Job Editor'를 사용하여 읽기/쓰기 권한을 부여합니다. 또한 단독으로 '작업 뷰어'로 서비스 계정을 설정하여 읽기 전용 액세스만 할 수 있습니다.

다음 단계에서는 사용자에게 이 서비스 계정에 대한 액세스 권한을 부여할지 묻습니다. 이 단계를 건너뛸 수 있지만 하단 근처에 있는 '+ 키 만들기'를 클릭해야 합니다. 새 JSON 사용자 인증 정보 파일이 자동으로 다운로드됩니다. 파일을 서버에 저장합니다. 이후 섹션에서 작성하는 코드에서 이 파일을 사용하여 인증합니다.

환경 변수 설정하기

사용 편의성을 위해 Google Cloud Shell을 사용합니다. 여러분의 개발 환경에서 이 작업을 하고 싶으신가요? 좋습니다. 원하는 언어로 Google Cloud SDK클라이언트 라이브러리를 설치해야 합니다. 이 Codelab에서는 Python을 사용합니다. Cloud Shell에 이미 Cloud 클라이언트 라이브러리가 설치되어 있습니다. 잘 맞나요?

라이브러리를 사용하여 코드를 실행하려면 두 개의 환경 변수가 설정되어 있는지 확인해야 합니다. 하나는 프로젝트 ID를 지정하고 다른 하나는 서비스 계정의 키 파일을 지정합니다. 설정해 드립니다.

프로젝트에서 웹 콘솔의 오른쪽 상단에 있는 '>_" 아이콘을 클릭하여 Cloud Shell을 엽니다. 프로젝트 ID를 지정하고 json 키 파일의 경로를 설정하려면 다음 환경 변수를 추가하세요.

export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json"

시스템에서 취업정보를 검색하기 전에 실제로 존재하는 취업정보가 몇 개 있는지 확인해야 합니다.

API를 사용하여 기업과 일자리를 추가하는 방법을 알아보고 싶다면 그 주제에서 Codelab을 실행해 보세요. 그렇지 않은 경우 이 섹션에서 단계를 안내합니다.

Cloud Shell에서 코드 편집기 열기

Google Cloud Console의 오른쪽 상단에 있는 Cloud Shell 아이콘을 사용하여 Cloud Shell을 엽니다.

Cloud Shell의 오른쪽 상단에는 일련의 아이콘이 있습니다. 다음과 같이 File -> Launch Code Editor를 클릭합니다.

회사 및 채용정보를 만듭니다.

File -> New File을 사용하여 새 소스 파일을 만들고 아래 콘텐츠로 채웁니다. 이름을 create_some_jobs.py로 지정합니다.

회사 및 작업 생성에 API를 사용하는 방법은 이 Codelab에서 다루지 않습니다. 이전 Codelab인 Job Search API&quot를 통해 방법을 확인할 수 있습니다. 아래 코드는 검색 API의 다양한 기능을 실험하고 어떤 결과가 발생하는지 확인할 수 있도록 시스템에 몇 가지 작업만 생성합니다.

create_some_jobs.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')


project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']


def create_company(request):
    # This is the API call that actually creates the new company.
    result = client_service.projects().companies().create(
        parent=project_id, body=request).execute()
    return result


def create_job(request):
    # The actual API call happens here.
    result = client_service.projects().jobs().create(
        parent=project_id, body=request).execute()
    print('Job created: %s' % result)
    return result


def create_foo():
    foocorp_company_request = {
        "company": {
            'display_name': "FooCorp",
            'external_id': "foo2_llc"
        }
    }

    result_company = create_company(foocorp_company_request)
    company_name = result_company.get('name')

    job = {
        'company_name': company_name,
        'title': 'Senior Software Engineer',
        'addresses': ["Mountain View, CA"],

        'description':
        """Experienced software engineer required for full-time position.
        Leadership ability and ability to thrive in highly competitive environment a must.
        <p />Ignore postings from that "Bar" company, their microkitchen is terrible.  Join Team Foo!""",
        'requisition_id': 'foo_swe',
        'application_info': {
            'uris': ['http://www.example.com/foo/software-engineer-application'],
            'emails': ['apply@example.com']
        }
    }
    request = {'job': job}
    result_job = create_job(request)


def create_horsehub():
    horsehub_company_request = {
        "company": {
            'display_name': "Horse Hub",
            'external_id': "horsies_llc"
        }
    }

    result_company = create_company(horsehub_company_request)
    company_name = result_company.get('name')

    job = {
        'company_name': company_name,
        'title': 'Junior Software Engineer',
        'description':
        """Hiring entry level software engineer required for full-time position.
        Must be passionate about industry intersection of horses and technology.
        Ability to intelligently discuss the equine singularity a major bonus.
        <p />C'mon bub! Join Horse Hub!""",
        'requisition_id': 'hh_swe',
        'application_info': {
            'uris': ['http://www.example.com/foo/software-engineer-horsehub'],
            'emails': ['apply-horsehub@example.com']
        }
    }
    request = {'job': job}
    result_job = create_job(request)


def create_tandem():
    tandem_company_request = {
        "company": {
            'display_name': "Tandem",
            'external_id': "tandem"
        }
    }

    result_company = create_company(tandem_company_request)
    company_name = result_company.get('name')

    job = {
        'company_name': company_name,
        'title': 'Test Engineer',
        'description':
        """Hiring Test Engineer for full-time position with Tandem.  Must be detail oriented
        and (obviously) comfortable with pair programming.  Will be working with team of Software Engineers.
        <p />Join Tandem today!""",
        'requisition_id': 'tandem_te',
        'application_info': {
            'uris': ['http://www.example.com/tandem/test-engineer'],
            'emails': ['apply-tandem-test@example.com']
        },
        'promotionValue': 1
    }
    request = {'job': job}
    result_job = create_job(request)
    job['requisition_id'] = 'a_tandem_te'
    result_job = create_job(request)


try:
    create_foo()
    create_horsehub()
    create_tandem()

except Error as e:
    print('Got exception while creating company')
    raise e

콘솔에서 위 코드를 실행합니다.

$ python create_some_jobs.py
Job created:
(Lots of output here)

모든 검색에 대해 RequestRequestMetadata라는 두 개의 객체를 제공해야 합니다.

먼저 RequestMetadata에 중점을 둡니다.

RequestMetadata 객체는 검색을 요청하는 사용자에 대한 정보를 제공합니다. 일관된 사용자 경험을 보장하고 머신러닝 모델을 효과적으로 학습시키기 위해서는 이러한 세부정보를 제공하는 것이 중요합니다.

다음 네 가지 속성은 요청 객체를 구성합니다.

  • domain(필수). foo.com과 같이 검색이 호스팅되는 도메인입니다.
  • sessionId (필수)는 세션의 고유 식별 문자열입니다. 세션은 일정 기간 동안 최종 사용자가 서비스와 상호작용한 기간으로 정의됩니다.
  • userId(필수)는 사용자를 나타내는 고유 식별 문자열입니다.
  • deviceInfo(선택사항)는 기기 ID 및 유형으로 구성되며 예를 들어 웹 검색과 앱 검색을 구분할 수 있습니다.

유형 및 설명 정보와 함께 전체 필드 목록은 RequestMetadata 문서에서 확인할 수 있습니다.

검색을 위한 최소 단계는 다음과 같습니다.

  1. RequestMetadata 객체 정의
  2. RequestMetadata를 "요청" 객체에 넣음
  3. 해당 요청을 쿼리의 정의로 사용하여 Jobs API 검색을 수행합니다.
  4. 결과를 검사합니다.

그 모습을 직접 확인해 보겠습니다. 새 파일 search_jobs.py를 열고 다음을 붙여넣습니다.

search_jobs.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

# 1) Define RequestMetadata object
request_metadata = {
    'domain':     'example.com',
    'session_id': 'a5ed434a3f5089b489576cceab824f25',
    'user_id':    '426e428fb99b609d203c0cdb6af3ba36',
}

try:
    # 2) Throw RequestMetadata object in a request
    request = {
        'request_metadata': request_metadata,
    }

    # 3) Make the API call
    response = client_service.projects().jobs().search(
        parent=project_id, body=request).execute()

    # 4) Inspect the results
    if response.get('matchingJobs') is not None:
        print('Search Results:')
        for job in response.get('matchingJobs'):
            print('%s: %s' % (job.get('job').get('title'),
                                job.get('searchTextSnippet')))
    else:
        print('No Job Results')

except Error as e:
    # Alternate 3) or 4) Surface error if things don't work.
    print('Got exception while searching')
    raise e

'search"'를 실행해보세요.

$ python search_jobs.py
Search Results:
Junior Software Engineer: None
Senior Software Engineer: None
Test Engineer: None
Test Engineer: None

시스템에서 모든 작업을 반환했습니다.

왜일까요?

아직 검색 매개변수를 지정하지 않았기 때문입니다. 그러면 어떻게 달성할 수 있을까요? 다음 섹션에서만 데이터베이스 검색에 도움이 될 뿐만 아니라 무언가를 필요한 경우 관련 질문

검색 매개변수와 함께 JobQuery 객체 추가

기술적으로 RequestMetadata가 유일한 필수 요청 필드이지만, 사용자가 실제로 무언가를 검색하고 싶을 가능성이 높으므로 JobQuery도 포함됩니다. JobQuery는 실제 검색어의 쿼리 문자열과 반환되는 필터를 좁히는 데 도움이 되는 여러 필터를 갖춘 매우 간단한 객체일 수 있습니다. 예를 들어 특정 회사의 취업정보만 반환하거나 고용 유형을 기준으로 필터링할 수 있습니다. 지금은 쿼리 문자열을 계속 사용할 예정이지만 JobQuery 문서에서 사용할 수 있는 필터에 대해 자세히 알아보세요.

JobQuery를 포함하도록 이전의 코드를 수정하여 기존 요청에 추가합니다.

search_jobs.py

...
# Create a job query object, which is just a key/value pair keyed on "query"
job_query = {'query': 'horses'}
...
    # Update the request to include the job_query field.
    request = {
        'request_metadata': request_metadata,
        'job_query': job_query
    }
 ...

그런 다음 검색을 다시 실행합니다.

$ python search_jobs.py
Search Results:
Junior Software Engineer: Hiring entry level software engineer required for full-time position. Must be
passionate about industry intersection of <b>horses</b> and technology. Ability to
intelligently discuss the equine singularity a major&nbsp;...

더 좋습니다. 여러 면에서 유용합니다. 자세히 살펴보겠습니다.

  • Search API가 쿼리 매개변수를 취하여 일치하는 결과만 반환했습니다.
  • 반환된 결과에는 일치하는 검색어가 굵게 표시된 HTML 형식 스니펫이 포함되어 있어 검색결과 목록에 더 쉽게 표시할 수 있습니다.
  • 검색어를 추가하는 코드는 두 줄밖에 아니었습니다.

이제 기본적인 채용정보를 찾고 실행할 수 있었습니다. 작업 데이터베이스에 대해 쿼리를 실행하고 결과를 검색할 수 있습니다. 여러 가지 놀라운 기능이 추가될 예정입니다.

JobView를 사용하여 반환되는 데이터 양 제한

jobView 속성을 지정할 수도 있습니다. 이 속성은 검색 요청으로 반환되는 정보의 양을 선언하는 ENUM입니다. JOB_VIEW_FULL은 각 작업 결과에 관한 모든 정보를 제공하지만, 일부 바이트를 절약하고 더 적은 필드를 반환하는 다른 옵션을 선택하는 것이 좋습니다. 작업 중인 플랫폼에 가장 적합한 옵션을 선택하세요. 가능한 값은 JobView 문서에서 가져온 값입니다.

  • JOB_VIEW_UNSPECIFIED - 기본값
  • JOB_VIEW_ID_ONLY: 작업 이름, 요청 ID 및 언어 코드만 포함합니다.
  • JOB_VIEW_MINIMAL - ID_ONLY 뷰의 모든 항목 및 제목, 회사 이름, 위치가 포함됩니다.
  • JOB_VIEW_DFA - MINIMAL 뷰의 모든 요소 및 공개 상태 및 작업 설명
  • JOB_VIEW_FULL - 사용 가능한 모든 속성입니다.

사용 가능한 필드를 더 자세히 보려면 검색어 결과에서 반환된 객체인 취업정보에 대한 문서를 확인하세요. 다음은 요청 객체에서 JobView를 지정하는 방법의 예입니다.

    # What your request object looks like with a jobView field
    request = {
        'requestMetadata': request_metadata,
        'jobQuery': job_query,
        'jobView' : 'JOB_VIEW_FULL'
    }

여기서는 이 작업의 목적을 위해 JOB_VIEW_FULL로 설정합니다. 쿼리되는 작업 수와 동시 사용자 수가 매우 적으므로 사용 가능한 다양한 필드를 더 쉽게 검사할 수 있기 때문입니다. 프로덕션에서는 검색결과 색인을 빌드할 때 더 가벼운 페이로드로 JobView를 사용하는 것이 좋습니다. 그 이유는 불필요한 대역폭을 차지하기 때문입니다.

페이지로 나누기

결과가 많을 수 있으므로 페이지로 나누기 인터페이스로 작업할 수 있도록 API도 페이지로 나누기가 가능합니다. 페이지 크기를 20 이하로 유지하여 지연 시간 문제를 방지하고 모든 결과를 로드하지 않고 항상 API를 통해 페이지로 나누기를 사용하는 것이 좋습니다. 다음 채용정보에 전달할 수 있도록 더 많은 작업이 있는 경우 응답에 nextPageToken을 가져오게 됩니다.

다시 한번 말씀드리자면, 요청에 단일 입력란을 추가하여 페이지당 원하는 검색결과 수를 지정하면 검색결과가 조정됩니다.

    request = {
        'requestMetadata': request_metadata,
        'jobQuery': job_query,
        'jobView' : 'JOB_VIEW_FULL',
        'pageSize': 1
    }

요청에서 pageSize가 1로 지정된 검색_작업 스크립트를 실행해 보세요. 이 코드를 실행하면 검색결과가 하나만 표시됩니다. 데이터베이스에 채용정보가 두 개 이상 있습니다. 나머지는 어떻게 얻나요?

현재 응답에 포함된 것보다 더 많은 결과가 포함된 경우 응답에 nextPageToken 필드가 있습니다. 이 값을 가져와서 pageToken이라는 이름으로 기존 요청에 다시 넣고 검색을 다시 실행합니다. 아래에 예시가 나와 있습니다.

    if "nextPageToken" in response:
        request["pageToken"] = response.get('nextPageToken')
        response = client_service.projects().jobs().search(
            parent=project_id, body=request).execute()
        for job in response.get('matchingJobs'):
            print('%s: %s' % (job.get('job').get('title'),
                                job.get('searchTextSnippet')))

쿼리 자동 맞춤법 검사

맞춤법 검사가 API에 내장되어 있어 구직자가 "manaer"라는 단어를 검색하면 "manager"라는 단어가 포함된 목록에서 결과가 반환됩니다.

이 기능은 기본적으로 사용하도록 설정되어 있습니다. 사용 중지하려면 JobQuery에 disableSpellCheck 필드를 추가하고 true로 설정합니다.

search_jobs.py

job_query = {
   'query': "Enginer",
   'disableSpellCheck': "true"
}

이제 실행해 봅니다. 이 플래그가 없으면 "Enginer"는 문자열에서 "Engineer" 문자열이 포함된 결과를 반환합니다. 맞춤법 검사를 사용 중지하면 같은 쿼리가 0개의 결과를 반환합니다.

다음으로, 검색결과 관련성을 조정하는 몇 가지 방법을 살펴보겠습니다.

Google Cloud Talent Solution Job Search API는 머신러닝 (ML)을 사용하여 사용자가 구직 시 취업정보의 관련성을 판단합니다.

취업정보와 회사에는 머신러닝 모델에서 검색결과의 관련성을 판단하기 위해 참조하는 여러 속성이 있습니다. 더 많은 정보를 제공하거나 추천 채용정보와 같은 정보를 사용해 관련성을 크게 높일 수 있습니다. 물론, 사람마다 관련이 있는 내용이 있기 때문에 검색결과와의 관련성은 측정하기가 어려울 수 있습니다. Job Search API는 취업정보 데이터의 몇 가지 신호를 기반으로 알고리즘을 사용합니다. 이러한 신호 중 일부가 검색결과에 어떤 영향을 미치는지 확인해 보겠습니다.

추천 취업정보를 사용하면 순조로운 관련성보다는 프로모션 값을 기준으로 채용정보의 순위를 지정하여 사용자 검색결과에 영향을 줄 수 있습니다. 추천 취업정보 검색을 실행하면 프로모션 값이 할당된 관련 채용정보만 반환됩니다.

추천 작업은 색인에서 개별 작업을 후원하고자 하는 경우에 유용합니다. 예를 들어 중요한 취업정보를 홍보하는 구인 사이트에서는 추천 취업정보 검색을 사용하여 구직자에게 스폰서 채용정보만 반환할 수 있습니다.

작업을 "featured"로 정의하기 위해 작업을 만들거나 업데이트할 때 작업 정의에서 promotionValue 필드를 사용합니다. 이 Codelab 초반에 사용된 create_some_jobs.py 스크립트에서 작업 중 하나가 프로모션 값을 사용하여 생성되었습니다. 다음은 관련 행에 줄이 래핑된 스니펫입니다.

create_some_jobs.py

   job = {
       'company_name': company_name,
       'title': 'Test Engineer',
       'description':
       """Hiring Test engineer for full-time position with Tandem.  Must be detail oriented
       and (obviously) comfortable with pair programming..
       <p />Join Tandem today!""",
       'requisition_id': 'tandem_te',
       'application_info': {
           'uris': ['http://www.example.com/tandem/test-engineer'],
           'emails': ['apply-tandem-test@example.com']
       },
       # Down here vvvvv
       'promotionValue': 1
       # Up there ^^^^^
   }

프로모션 값은 1에서 10 사이의 정수일 수 있습니다. 검색 모드를 FEATURED_JOB_SEARCH로 변경하면 다음 방법을 확인할 때 검색결과에 다음과 같은 두 가지 영향을 미칩니다.

  • promotionalValue > 0인 작업만 표시됩니다.
  • 작업은 promotionalValue의 내림차순으로 정렬됩니다. promotionalValue가 동일한 취업정보는 검색 알고리즘에 따라 관련성을 기준으로 정렬됩니다.
   request = {
       'searchMode': 'FEATURED_JOB_SEARCH',
       'requestMetadata': request_metadata,
       'jobQuery': job_query,
       'jobView' : 'JOB_VIEW_FULL'
   }

검색 모드를 FEATURED_JOB_SEARCH로 설정하도록 요청을 업데이트합니다. 그런 다음 코드를 실행하면 아래와 비슷한 출력이 표시됩니다.

$ $ python search_jobs.py
Search Results:
Test Engineer: Hiring Test <b>engineer</b> for full-time position with Tandem. Must be detail oriented
and (obviously) comfortable with pair programming.. Join Tandem today!

promotionValue가 명시적으로 0보다 큰 값으로 설정된 취업정보만 반환됩니다.

지리적 위치

가장 중요한 속성 중 하나는 지리적 위치입니다. 회사와 채용정보에는 모두 위치 속성이 있지만 사용자가 검색할 때 채용정보 위치가 회사 위치보다 사용됩니다. API에서 위치정보를 사용하여 검색과 가장 관련성이 높은 취업정보를 반환할 수 있도록 채용정보 및 회사의 특정 주소 필드를 사용해야 합니다. 사용자가 '샌프란시스코'를 검색한다면 샌프란시스코 주변과 가장 중요한 일자리를 모두 확인하고 싶어 할 것입니다.

이 예시에서 FooCorp의 선임 소프트웨어 엔지니어라는 직위는 캘리포니아주 마운틴뷰로 설정되어 있습니다. 이렇게 하면 페이지를 다시 찾고 싶지 않은 경우 다음과 같은 코드가 표시됩니다.

create_some_jobs.py (FooCorp에서 위치가 정의됨)

...
    job = {
        'company_name': company_name,
        'title': 'Senior Software Engineer',
        'addresses': ["Mountain View, CA"],
...

도시 이름도 괜찮습니다. 하지만 최상의 결과를 얻으려면 전체 주소를 사용하세요.

기술적으로는 선택사항이지만 위치를 추가하면 구직자에게 많은 유용한 기능을 제공할 수 있습니다. CTS는 이 주소를 경도/위도로 변환하여 검색 신호로 사용합니다. 예를 들어 Palo Alto 영역에서 최대 10마일 범위의 취업정보를 검색하도록 JobQuery를 조정하는 방법은 다음과 같습니다.

search_jobs.py (팔로 알토 또는 그 주변에서 채용 정보 검색)

...
location_filter = {
   'address': 'Palo Alto',
   'distance_in_miles': 10,
   }

job_query = {
   'location_filters': [location_filter],
   'query': "Engineer",
}
...

이 코드를 실행합니다. 채용정보 생성 코드 중 어느 곳에서도 팔로 알토가 언급되지 않았다는 점에 유의하세요. 직무 설명, 회사 이름 등은 입력할 필요가 없습니다.

$ python search_jobs.py
Search Results:
Senior Software Engineer: Experienced software <b>engineer</b> required for full-time position. Leadership ability
and ability to thrive in highly competitive environment a must. Ignore postings
from that &quot;Bar&quot; company, their microkitchen&nbsp;...

결과가 반환되었습니다. 팔로 알토는 작업 주변 10마일 이내 (10마일은 LocationFilter에서 정의한 경계)입니다.

이 Codelab의 범위를 벗어나는 위치로도 할 수 있는 재미있는 작업입니다. 다음 항목을 살펴보시기 바랍니다.

  • 통근 기반 검색 - 거리 대신 통근 시간으로 정의된 지역 내 채용정보를 검색합니다. 아, 생각이 나셨을 텐데... 우리는 모두 리더입니다. 우리는 모두 그렇게 해요.
  • 여러 위치 검색 - 여러 도시의 취업정보를 동시에 찾는 방법

키워드 및 확장

물론 직책과 직무는 검색어에 적합한지를 결정하는 데 중요한 역할을 합니다. '스크럼 마스터' 작업을 게시한 후 설명에 '소프트웨어 개발자 관리'가 언급된 경우, '소프트웨어 개발 관리자'를 검색하면 해당 채용정보가 포함되어야 합니다. 너무 많은 키워드를 직무 설명에 포함하면 덜 관련성 높은 취업정보가 표시될 수 있습니다.

이 API에는 또한 검색 시 결과를 더 효과적으로 제어할 수 있는 몇 가지 매개변수가 있습니다. 키워드 일치를 사용하면 검색이 일반 ML 기반 검색결과 이외의 키워드를 찾아야 하는 경우 사용 또는 사용 중지할 수 있습니다. 또한 위치별 필터 중 일부가 완화됩니다. 넓히면 지정된 매개변수의 검색 범위가 넓어져서 더 많은 검색 결과를 얻을 수 있습니다.

이것이 작동의 예입니다. 먼저 확장을 사용 설정하지 않고 검색어 'Agile"로 검색합니다. 이 Codelab에서 제공된 스크립트를 사용하여 회사 및 작업을 만든 경우 아무 일도 일어나지 않습니다. 왜일까요? 등록정보에서 'Agile"가 아니기 때문입니다. 그러나 엔지니어링 작업과 관련하여 널리 사용되는 프로그래밍 방법론으로 사용됩니다.

키워드 확장을 통해 어떤 변화가 있는지 살펴보세요.

search_jobs.py(확장이 사용 설정된 경우)

...
job_query = {
    'query': "Agile",
}

request = {
    'requestMetadata': request_metadata,
    'jobQuery': job_query,
    'jobView' : 'JOB_VIEW_FULL',
    'enableBroadening' : True
}
...

이제 스크립트를 다시 실행하면 몇 가지 결과가 표시됩니다.

$ python search_jobs.py
Search Results:
Junior Software Engineer: Hiring entry level software engineer required for full-time position. Must be
passionate about industry intersection of horses and technology. Ability to
intelligently discuss the equine singularity a major&nbsp;...

Senior Software Engineer: Experienced software engineer required for full-time position. Leadership ability
and ability to thrive in highly competitive environment a must. Ignore postings
from that &quot;Bar&quot; company, their microkitchen&nbsp;...

Test Engineer: Hiring Test engineer for full-time position with Tandem. Must be detail oriented
and (obviously) comfortable with pair programming.. Join Tandem today!

어떻게 하면 이 모든 것을 반환할 수 있을까요? "Agile"를 "sprightly", "dexterous", "lively" 또는 "swift"와 같은 동의어로 바꿔 보세요. 어떠한 경우에도 아무것도 표시되지 않습니다.

하지만 여기에 확대를 적용할 수 있는 절충안이 있습니다. 채용정보 권장사항 페이지에 '이 매개변수를 사용 설정하면 검색결과 수가 늘어나지만 전체 검색결과의 관련성은 낮아질 수 있습니다'라고 명시되어 있습니다. 기본적으로 이 기능은 품질을 저하시켜 수량을 추가할 위험이 있습니다. 반면 구직자가 방금 한 말을 할 때 잘 모르는 방법을 찾는 데도 도움이 될 수 있습니다.

다각화

때로는 매우 유사한 여러 채용 정보가 검색결과에 나란히 반환될 수 있습니다. 이는 구직자에게 불리한 결과를 초래할 수 있으며, 이는 사용 가능한 다양한 결과를 확인하지 못합니다.

이 문제는 다각화 기능에서 해결되었습니다. 직책, 직무 카테고리, 위치에 따라 채용정보가 유사한 것으로 식별됩니다. 이렇게 하면 상당히 비슷한 결과가 클러스터링되어 클러스터에서 한 개의 작업만 검색결과에서 상단에 표시됩니다. '엔지니어'를 검색할 때 다음과 같은 결과가 표시될 수 있습니다.

$ python search_jobs.py
Test Engineer ...
Senior Software Engineer ...
Junior Software Engineer ...
Test Engineer ...

왜 그렇게 주문되었나요? 소프트웨어 엔지니어 업무는 두 회사 (HorseHub 및 FooCorp)에서 일하고 있으며 설명도 다릅니다. 이들은 소프트웨어 엔지니어링 작업은 모두 서로 다르지만 서로 가까이에 있음을 보증할 만큼 차이가 있습니다.

그러나 '테스트 엔지니어' 등록정보를 살펴보면 동일한 회사에 대해 정확히 동일한 등록정보가 두 번 게시되었음을 알 수 있습니다. 다각화는 기본적으로 사용 설정되어 있으므로 두 번째 테스트 엔지니어 등록정보는 기술적으로는 더 흥미로운 다른 등록정보보다 덜 중요한 것으로 간주되었습니다.

다양화 수준에는 가능한 세 가지 설정이 있지만, 명시적으로 하나만 선택해야 합니다. 주요 부분은 다음과 같습니다.

  • DIVERSIFICATION_LEVEL_UNSPECIFIED - 레벨을 지정하지 않았다는 점만 나타내며 기본값은 기본값입니다 (현재 기본값은 SIMPLE과 동일함).
  • 사용 중지됨 - 다각화 사용 중지 -- 일반적으로 너무 유사하여 마지막 페이지로 푸시되는 작업은 게재순위가 변경되지 않습니다.
  • 단순 - 다각화 기본 동작 매우 유사한 결과가 검색결과의 마지막 페이지 끝으로 푸시됩니다.

요청의 다각화 수준을 명시적으로 설정하는 방법입니다. 이 Codelab에서 수행한 대부분의 다른 작업과 마찬가지로 요청을 조정하기만 하면 됩니다. 작업 쿼리 및 요청에 대해 아래 설정을 시도합니다. 그러면 다각화가 사용 중지되고 검색어가 '엔지니어'로 설정됩니다.

search_jobs.py(다각화 수준)

job_query = {
    'query': "Engineer",
}

# 2) Throw RequestMetadata object in a request
request = {
    'requestMetadata': request_metadata,
    'jobQuery': job_query,
    'jobView' : 'JOB_VIEW_FULL',
    'diversificationLevel': 'DISABLED'
}

지금 search_jobs.py를 실행하면 약간 다른 순서가 표시됩니다. 이제 테스트 엔지니어 작업이 더 가까워집니다.

$python search_jobs.py
Test Engineer: Hiring Test <b>Engineer</b> for full-time position with Tandem. Must be detail oriented
and (obviously) comfortable with pair programming. Will be working with team of
Software Engineers. Join Tandem today!

Test Engineer: Hiring Test <b>Engineer</b> for full-time position with Tandem. Must be detail oriented
and (obviously) comfortable with pair programming. Will be working with team of
Software Engineers. Join Tandem today!

Software Engineer: Experienced software <b>engineer</b> required for full-time position. Leadership ability
and ability to thrive in highly competitive environment a must. Ignore postings
from that &quot;Bar&quot; company, their microkitchen&nbsp;...

Software Engineer: Hiring entry level software <b>engineer</b> required for full-time position. Must be
passionate about industry intersection of horses and technology. Ability to
intelligently discuss the equine singularity a major&nbsp;...

Job Search API를 사용하여 취업정보를 쿼리하는 방법을 공식적으로 배웠습니다.

학습한 내용

  • 클라우드 프로젝트 설정
  • 개발 환경 설정
  • 작업 쿼리
  • 검색 매개변수와 함께 JobQuery 객체 추가
  • jobView를 사용하여 반환되는 데이터 양 제한
  • 페이지로 나누기
  • 자동으로 검색어의 맞춤법 검사
  • 추천 채용정보
  • 검색 관련성 조정
  • 지리적 위치
  • 키워드 및 확장
  • 다각화

자세히 알아보기