Wysyłanie zapytań do interfejsu API Job Search o interfejs Google Cloud

Z tego modułu ćwiczeń dowiesz się, jak usprawnić pracę i pozyskiwać nowych pracowników w swojej organizacji przy użyciu interfejsu Cloud Talent Solution API (CTS). Dzięki CTS możesz zwiększyć skuteczność systemów uczących się w swojej pracy.

Czego się nauczysz:

  • Włącz funkcję CTS w projekcie Google Cloud
  • Zapytanie dotyczące otwartych zadań przy użyciu interfejsu Job Search API

Czego potrzebujesz

  • Projekt Google Cloud z rozliczeniami jest już skonfigurowany (jeśli go jeszcze nie masz, utwórz go).
  • Około godziny

Jak będziesz korzystać z tego samouczka?

Przeczytaj tylko te materiały Przeczytaj je i wykonaj ćwiczenia.

Jak oceniasz swoje dotychczasowe doświadczenia z Google Cloud Platform?

Początkujący dla średniozaawansowanych ekspert

Ten samouczek ma w pełni działać w Google Cloud Platform. Nie musisz pobierać plików na stację roboczą.

Włącz interfejs Cloud Talent Solutions API

Otwórz swoją aplikację w Cloud Console i kliknij menu w lewym górnym rogu. Przejrzyj menu Omówienie rozwiązania -</gent.

Ponieważ jest to nowy projekt, nastąpi przekierowanie na nowy ekran z prośbą o włączenie interfejsu API. Kliknij Włącz i zaczekaj kilka minut, aż interfejs API zostanie włączony w tym projekcie.

Włącz logowanie danych

Wrócisz do poprzedniej strony. Pojawi się nowe okno z prośbą o włączenie logowania danych. Wymaga to jedynie potwierdzenia, że interfejs Job Search API jest oparty na modelu systemów uczących się, który potrzebuje danych. W ramach integracji możesz wysyłać informacje o zdarzeniach od użytkowników, którzy szukają dalszych modeli trenowania. Po zaimplementowaniu tego kodu możesz określić, jakie informacje mają być wysyłane.

Omówimy szczegółowo, na czym polegają te zdarzenia i jak je wysyłać, ale dobrze wytrenowane modele będą działać. Włącz logowanie danych, a następnie kliknij „Połączenia z kontem usługi” w panelu nawigacyjnym po lewej stronie w tym oknie.

Konfiguracja konta usługi

Żądanie API należy wykonać w imieniu konkretnego uwierzytelnionego konta. Sprawdzone metody Google Cloud Platform zaleca skonfigurowanie konta usługi. Konta usługi pełnią prosty sposób konfigurowania uwierzytelnionych użytkowników, którzy mają ograniczone uprawnienia. Pomoże Ci to w tworzeniu niezależnego i bezpiecznego systemu.

Na przykład do korzystania z interfejsu API Job Search potrzebne jest konto usługi. Utwórzmy je! Po kliknięciu „&” kliknij „Zarządzaj kontami usługi” u góry strony, a następnie wybierz „Utwórz konto usługi”. Przyznaj mu uprawnienia do odczytu/zapisu w sekcji „Edytor zadań” w sekcji "Cloud Talent Solution (Rozwiązania talentów w chmurze) w menu po lewej stronie. Można też założyć konto usługi z uprawnieniami tylko do wyświetlania oferty pracy i mieć tylko dostęp tylko do odczytu.

W następnym kroku zapytamy Cię, czy chcesz przyznać użytkownikom dostęp do tego konta usługi. Możesz pominąć ten krok, ale pamiętaj, aby kliknąć „+ Utwórz klucz” u dołu strony. Zostanie automatycznie pobrany nowy plik danych JSON. Zapisz ten plik na swoim serwerze (kod, który utworzysz w późniejszej sekcji, będzie go używać do uwierzytelniania).

Ustawianie zmiennych środowiskowych

Dla ułatwienia będziemy korzystać z Google Cloud Shell. Jeśli chcesz to robić w swoim środowisku programistycznym, to świetnie. Pamiętaj, aby zainstalować pakiet SDK Google Cloud i biblioteki klienta w wybranym języku (ćwiczenia z programowania będą oparte na języku Python). W Cloud Shell są już zainstalowane biblioteki klienta Cloud. Przydatne, prawda?

Aby uruchomić kod za pomocą bibliotek, musisz ustawić 2 zmienne środowiskowe: jedną do określenia identyfikatora projektu, a drugą do określenia pliku klucza konta usługi. Skonfigurujmy je.

W swoim projekcie kliknij ikonę „>_"” w prawym górnym rogu konsoli internetowej, aby otworzyć Cloud Shell. Dodaj te zmienne środowiskowe, aby określić identyfikator projektu i ustawić ścieżkę do pliku klucza json:

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

Przed rozpoczęciem wyszukiwania ofert pracy w systemie musimy sprawdzić, czy faktycznie masz ich kilka.

Jeśli chcesz się dowiedzieć, jak dodawać firmy i zatrudnienia za pomocą interfejsu API, Możesz odbyć ćwiczenia z programowania dotyczące tego tematu. W przeciwnym razie ta sekcja zawiera szczegółowe instrukcje.

Otwórz edytor kodu w Cloud Shell

W konsoli Google Cloud otwórz Cloud Shell, klikając ikonę Cloud Shell w prawym górnym rogu.

W prawym górnym rogu Cloud Shell pojawi się seria ikon. Kliknij File -> Launch Code Editor (Plik -> uruchom edytor kodu), jak pokazano tutaj:

Utwórz firmy i oferty pracy.

Użyj polecenia Plik -> Nowy plik, aby utworzyć nowy plik źródłowy i wypełnij go poniżej. Nazwij go create_some_jobs.py.

Pamiętaj, że korzystanie z interfejsu API do tworzenia firm nie jest częścią tego ćwiczenia z programowania. Aby dowiedzieć się, jak to zrobić, możesz skorzystać z wcześniejszego ćwiczenia z interfejsu API Job Search API. Poniższy kod powoduje utworzenie w systemie kilku zadań, dzięki czemu możemy eksperymentować z różnymi funkcjami interfejsu API wyszukiwarki i sprawdzać wyniki.

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

Uruchom powyższy kod w konsoli.

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

Przy każdym wyszukiwaniu musimy podać 2 obiekty: Request i RequestMetadata.

Skupmy się najpierw na Żądanych metadanych.

Obiekt RequestMetadata dostarcza informacji o użytkowniku wysyłającym żądanie wyszukiwania. Podawanie tych szczegółów jest niezbędne, aby zapewnić spójność z użytkownikami, a także by lepiej trenować modele systemów uczących się.

4 obiekty składają się z tych 4 właściwości:

  • domain (wymagana) domena, z której wyszukiwanie jest hostowane, na przykład foo.com.
  • sessionId (wymagany) – unikalny ciąg identyfikujący sesję. Sesja to czas trwania interakcji użytkownika z usługą w określonym przedziale czasu.
  • userId(wymagany) – unikalny ciąg identyfikujący użytkownika.
  • Parametr deviceInfo (opcjonalny) składa się z identyfikatora i typu urządzenia, dzięki czemu możesz np. rozróżnić wyszukiwanie w internecie od wyszukiwania aplikacji.

Pełna lista pól oraz informacje o typie i opisie są też dostępne w dokumentacji elementu RequestMetadata.

Minimalne czynności umożliwiające przeprowadzenie wyszukiwania:

  1. Zdefiniuj obiekt RequestMetadata
  2. Weź ten obiekt RequestMetadata i umieść go w obiekcie "request"
  3. Przeprowadź wyszukiwanie interfejsu Jobs API, używając tego żądania jako definicji naszego zapytania.
  4. Sprawdź wyniki.

Zobaczmy, jak to wygląda. Otwórz nowy plik search_jobs.py i wklej go w polu poniżej.

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

Spróbuj uruchomić ""search".

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

Zwraca ono każde zadanie systemowe.

Dlaczego?

Ponieważ nie ma jeszcze parametrów wyszukiwania, Jak to możliwe? Tylko w następnej sekcji omówiliśmy coś, co nie tylko będzie przydatne, ale też całkowicie potrzebne do wyszukiwania w bazie danych. Coś w rodzaju...

Dodaj obiekt JobQuery z parametrami wyszukiwania

Technicznie żądanie XML to jedyne wymagane pole żądania, ale bardziej prawdopodobne jest, że będziemy szukać czegoś, co umożliwi nam dołączenie do oferty pracy. JobQuery może być dość prostym obiektem, z ciągiem zapytania o rzeczywiste wyszukiwane hasła i różnymi filtrami, które pomagają zawęzić zakres zwróconych zadań. Możesz na przykład zwracać tylko oferty pracy od określonej firmy lub filtrować je według rodzaju zatrudnienia. Na razie po prostu zajmiemy się ciągiem zapytania, ale dowiesz się więcej o filtrach dostępnych w dokumentacji JobQuery.

Zmodyfikuj kod wcześniej, aby dodać JobQuery, i dodaj go do istniejącego żądania.

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
    }
 ...

Następnie przeprowadź wyszukiwanie ponownie.

$ 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;...

Lepiej! Jest pod kilkoma względami lepszy. Zobaczmy, co się stało:

  • Interfejs API wyszukiwania pobrał parametr zapytania i zwrócił tylko pasujący wynik
  • Zwrócony wynik zawierał fragment kodu w formacie HTML z pasującym wyszukiwanym hasłem pogrubiony, by ułatwić wyświetlanie na liście wyników wyszukiwania.
  • Dodanie zapytania to tylko 2 dodatkowe wiersze kodu.

W tym czasie masz już pod ręką podstawowe informacje o poszukiwaniu pracy. Możesz uruchamiać zapytania do bazy danych zadań i pobierać wyniki. ale czeka na Ciebie wiele niezwykłych rzeczy.

Ogranicz ilość danych zwracanych za pomocą zadania viewView

Możesz też określić właściwość workView, która deklaruje, ile informacji chcesz wyświetlić w odpowiedzi na zapytanie. JOB_VIEW_FULL zwraca wszystkie informacje o każdym wyniku zadania, ale możesz zapisać niektóre bajty i wybrać inną opcję, która zwraca mniej pól. Wybierz opcję, która będzie najbardziej odpowiednia dla platformy, nad którą pracujesz. Oto możliwe wartości (pochodzące z dokumentacji JobView):

  • JOB_VIEW_UNSPECIFIED – domyślny.
  • JOB_VIEW_ID_ONLY – zawiera tylko nazwę zadania, identyfikator oferty oraz kod języka.
  • JOB_VIEW_MINIMAL – Wszystko w widoku ID_ONLY, a także tytuł, nazwa firmy i lokalizacje.
  • JOB_VIEW_Small – wszystko w widoku MINIMAL, plus widoczność i opis stanowiska.
  • JOB_VIEW_FULL – wszystkie dostępne atrybuty.

Bardziej szczegółowe informacje o dostępnych polach znajdziesz w dokumentacji dotyczącej pracy, która jest zwracana w wynikach wyszukiwania. Oto przykład, jak określić JobView w obiekcie żądania.

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

Na potrzeby tego ćwiczenia opracowaliśmy wartość JOB_VIEW_FULL, ponieważ liczba zapytań, które są wysyłane (i liczba jednoczesnych użytkowników), jest dość niska, co ułatwia nam sprawdzanie różnych dostępnych pól. W środowisku produkcyjnym podczas tworzenia indeksu wyników wyszukiwania chcesz użyć JobView z lżejszym ładunkiem, ponieważ to wymaga mniej przepustowości.

Podział na strony

Możesz uzyskać wiele wyników, więc interfejs API dzieli się na strony, tak aby można było używać interfejsu podziału na strony. Zalecamy, aby rozmiar strony nie przekraczał 20, aby uniknąć problemów z opóźnieniem. Zawsze stosuj podział na strony przez interfejs API, zamiast wczytywać wszystkie wyniki. W odpowiedzi odpowiedź „nextPageToken” znajdzie się w kolejnych zadaniach, dzięki czemu możesz przekazać je w kolejnym parametrze pageToken.

Tą korektę do wyników wyszukiwania przeprowadzamy ponownie, dodając do żądania jedno pole, określając liczbę wyników wyszukiwania na stronie.

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

Spróbuj uruchomić skrypt search_jobs z wartością parametru pageSize podaną w żądaniu w postaci 1. Jeśli go uruchomisz, otrzymasz tylko jeden wynik wyszukiwania. W bazie danych masz więcej niż 1 ofertę pracy. Jak uzyskujesz resztę?

Jeśli wyniki są więcej niż obecna odpowiedź, w odpowiedzi znajdzie się pole nextPageToken. Wpisz tę wartość, podaj ją w istniejącym żądaniu pod nazwą pageToken i ponownie przeprowadź wyszukiwanie. Oto przykład, jak to zrobić.

    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')))

Automatyczne sprawdzanie pisowni zapytania

Funkcja sprawdzania pisowni jest wbudowana w interfejs API – jeśli osoba poszukująca pracy będzie szukać słowa „</a>,</a>, zostaną zwrócone wyniki dotyczące wpisów zawierających słowo „menedżer”.

Funkcja ta jest włączona domyślnie. Jeśli chcesz je wyłączyć, dodaj do zadania JobQuery pole disableSpellCheck i ustaw je na wartość prawda.

search_jobs.py

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

Spróbuj uruchomić to polecenie. Jeśli nie będzie tej flagi, "Engineer" zwróci wyniki z ciągiem "Engineer&quot. Gdy sprawdzanie pisowni jest wyłączone, to samo zapytanie zwróci 0 wyników.

Czas na kilka sposobów na dostosowanie trafności wyników wyszukiwania.

Interfejs Google Cloud Talent Solution Job Search API wykorzystuje systemy uczące się do określania trafności ofert pracy, gdy użytkownik szuka pracy.

Zadania i firmy mają kilka właściwości, do których nawiązują modele systemów uczących się, aby określić trafność wyników wyszukiwania. Możesz zwiększyć trafność, przesyłając więcej informacji lub używając takich informacji jak polecane oferty pracy. Oczywiście trafność wyników wyszukiwania może być skomplikowana, zwłaszcza że elementy różnią się w zależności od odbiorcy. Interfejs API Job Search używa algorytmu opartego na kilku sygnałach z danych o zadaniu. Sprawdźmy, jak niektóre z tych sygnałów wpływają na wyniki wyszukiwania.

Funkcja Polecane oferty pracy daje użytkownikom wpływ na wyniki wyszukiwania na podstawie rankingu stanowisk, a nie tylko na podstawie trafności. Po uruchomieniu funkcji Polecane oferty pracy wyświetlane są tylko odpowiednie oferty pracy z przypisaną wartością promocyjną.

Polecane zadania są przydatne, jeśli chcesz sponsorować poszczególne oferty pracy w indeksie. Na przykład witryna oferująca oferty pracy, która promuje oferty pracy o znaczeniu biznesowym, może użyć wyszukiwania Polecane oferty pracy, by znaleźć tylko oferty sponsorowane.

Aby zdefiniować zadanie jako "featured" do utworzenia lub zaktualizowania zadania używane jest w jego polu pole promotionValue. W skrypcie create_some_jobs.py, którego użyto wcześniej w ramach tego ćwiczenia z programowania, jedno z zadań zostało utworzone przy użyciu wartości promocji. Jeszcze raz ten fragment z odpowiednim wierszem w komentarzach:

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 ^^^^^
   }

Wartość promocyjna może być dowolną liczbą całkowitą z zakresu od 1 do 10. Gdy zmienisz tryb wyszukiwania na FEATURED_JOB_SEARCH (Ty zobaczysz, jak będzie to działało), wyniki wyszukiwania mogą zmienić się na 2 sposoby:

  • Pokazywane będą tylko oferty pracy z wartością promotionalValue > 0
  • Zadania są sortowane w kolejności malejącej według atrybutu promotionalValue. Oferty pracy o tej samej wartości promotionalValue będą sortowane według trafności (zgodnie z algorytmem wyszukiwania).
   request = {
       'searchMode': 'FEATURED_JOB_SEARCH',
       'requestMetadata': request_metadata,
       'jobQuery': job_query,
       'jobView' : 'JOB_VIEW_FULL'
   }

Zmień swoją prośbę, by ustawić tryb wyszukiwania na FEATURED_JOB_SEARCH. Następnie uruchom kod. Wyniki powinny być widoczne poniżej:

$ $ 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!

Jedyną zwracaną wartością jest zadanie z wartością promocyjną dla YouTube, której wartość jest wyraźnie ustawiona na 0.

Położenie geograficzne

Jedną z najważniejszych właściwości jest lokalizacja geograficzna. Zarówno firmy, jak i oferty pracy mają właściwości związane z lokalizacją, ale gdy użytkownik szuka pracy, informacje o lokalizacji miejsca pracy będą używane w lokalizacji firmy. Należy używać konkretnego pola adresu dla ofert pracy i firm, aby interfejs API mógł używać geolokalizacji do zwracania najtrafniejszych ofert pracy związanych z wyszukiwanym hasłem. Gdy ktoś szuka hasła „Poznań”, chce przede wszystkim znaleźć oferty pracy w Szczecinie i w pobliżu.

W naszych przykładowych stanowiskach na stanowisku starszego inżyniera w FooCorp pole lokalizacji jest ustawione w Mountain View w Kalifornii. Kod, który to robi (jeśli nie chcesz się cofać i wyszukać strony) wygląda tak:

create_some_jobs.py (gdzie lokalizacja jest określona w FooCorp)

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

Nazwa miejscowości będzie działać prawidłowo, ale w celu uzyskania najlepszych wyników użyj pełnego adresu.

Mimo że technicznie jest to opcjonalne, dodanie lokalizacji daje wiele możliwości. CTS przekonwertuje adres na długość i długość geograficzną i użyje go jako sygnału wyszukiwania. Możesz na przykład zmienić zapytanie takie jak JobQuery, tak by wyszukiwać oferty pracy w dzielnicy Palo Alto, przy czym maksymalna odległość to 10 mil:

search_jobs.py (szukaj pracy w Palo Alto)

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

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

Uruchamiaj ten kod, pamiętając, że nigdzie indziej w naszym kodzie tworzenia ofert pracy nie wspomniano już Palo Alto. Brak opisu stanowiska, nazwy firmy.

$ 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;...

Udało się! Ponieważ Palo Alto znajduje się w promieniu 10 km od zadania (10 mil to granica określona w LocationFilter)

Jest kilka innych fajnych rzeczy, które można zrobić przy użyciu lokalizacji spoza zakresu tych ćwiczeń z programowania. Zachęcamy do zapoznania się z:

Słowa kluczowe i poszerzanie zakresu danych

Tytuł i opis stanowiska odgrywają oczywiście ważną rolę, decydując o tym, czy jest on odpowiedni do wyszukiwanego hasła. Jeśli opublikowano ofertę pracy dla mastera „scrum master&quot”, a opis zawiera wzmiankę o „zarządzaniu programistami oprogramowania”, powinno się w nim umieścić hasło „"software Development Manager”. Unikaj dodawania zbyt wielu słów kluczowych do opisu stanowiska – w przeciwnym razie pojawi się mniej trafne oferty pracy.

Interfejs API zawiera też kilka parametrów, które można przekazywać podczas wyszukiwania, aby mieć większą kontrolę nad wynikami. Dopasowanie słów kluczowych umożliwia włączanie i wyłączanie słów kluczowych poza zwykłymi wynikami wyszukiwania opartymi na systemach uczących się. Rozluźni też niektóre filtry dotyczące konkretnych lokalizacji. Poszerzenie zasięgu powoduje zwiększenie zakresu wyszukiwania dla podanych parametrów, dzięki czemu możesz uzyskać więcej wyników dla danego wyszukiwania.

Oto przykład działania tej funkcji. Po pierwsze, bez włączania poszerzania wyszukiwania, wyszukaj hasło „Agile"”. Jeśli użyjesz skryptów podanych w tym ćwiczeniu do utworzenia firm i stanowisk, nic się nie pojawi. Dlaczego? Słowo &git" nie znajduje się w żadnym miejscu informacji o aplikacji. Jest to jednak powszechnie stosowana metoda programowania związana z pracami inżynieryjnymi.

Włączmy poszerzanie słów kluczowych, żeby zobaczyć, co się zmieni.

search_jobs.py (przy włączonym rozszerzeniu)

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

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

Teraz uruchom ponownie skrypt i zobaczysz wyniki.

$ 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!

Skąd wiemy, że to nie jest tylko „ogólna flaga” oznaczająca „powrót do wszystkiego”. Zamień &"„Elastyczny” i „zwinny” na synonimy, takie jak &"spurly", "dexterte", "live" lub „"swift"”. We wszystkich przypadkach nic nie pojawia się.

Jest jednak kompromis nad włączeniem poszerzania zasięgu. Strona ze sprawdzonymi metodami dotyczącymi ofert pracy zawiera wyraźną informację, że włączenie tego parametru zwiększa liczbę wyników wyszukiwania, ale może zmniejszyć trafność tych wyników. Zasadniczo ta funkcja wiąże się z ryzykiem dodania ilości elementów kosztem jakości. Z drugiej strony dla osoby poszukującej pracy może to być przydatne, jeśli chce znaleźć coś, czego przed chwilą nie wybrała.

Różnorodność

Czasami w wynikach wyszukiwania pojawia się kilka bardzo podobnych ofert pracy. Może to mieć negatywny wpływ na osoby poszukujące pracy, a dlatego nie będą widzieć dostępnych wyników.

Funkcja dywersyfikacji rozwiązała ten problem. Oferty pracy określamy na podstawie ich tytułów, kategorii i lokalizacji. Bardzo podobne wyniki są wtedy grupowane w taki sposób, że w wynikach wyszukiwania pojawia się tylko jedno zadanie z klastry. Być może zauważysz, że wyniki wyszukiwania dla inżyniera i dostawcy są takie jak:

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

Dlaczego tak się stało? Zajmują się 2 firmami (HorseHub i FooCorp) i mają różne opisy. Obie pracują na stanowisku inżynierów oprogramowania, ale różnią się od siebie na tyle, że powinny być blisko siebie w wynikach.

Jeśli jednak przyjrzymy się danym o „inżynierze testowanym”, jest to w rzeczywistości dokładnie taka sama wizytówka tej samej firmy, opublikowana dwukrotnie. Ponieważ dywersyfikacja jest domyślnie włączona, druga wersja Test Engine została uznana za mniej ważną (choć pod względem technicznym jest bardziej istotna) niż inne potencjalnie interesujące wpisy.

Poziom dywersyfikacji naprawdę ma 3 możliwe ustawienia, ale Ty nigdy nie wybierzesz konkretnego. Są to:

  • DIVERSIFICATION_LEVEL_UNSPECIFIED – oznacza tylko, że nie został określony poziom i powinno ono działać w domyślny sposób (obecnie jest to dokładnie to samo co SIMPLE).
  • WYŁĄCZONE – wyłącza dywersyfikację – stanowiska, które byłyby zazwyczaj przenoszone na ostatnią stronę ze względu na zbyt wysoką pozycję, nie zostaną zmienione.
  • SIMPLE – domyślne zachowanie związane z dywersyfikacją. Lista wyników jest uporządkowana w taki sposób, że wyniki bardzo podobne są przenoszone na koniec ostatniej strony wyników wyszukiwania.

W tym miejscu należy jednoznacznie określić poziom różnorodności żądania. Podobnie jak w przypadku większości innych ustawień, które wprowadziliśmy w tym ćwiczeniu z programowania, wystarczy, że dostosujesz swoją prośbę. Wypróbuj poniższe ustawienia zapytania i żądania, co spowoduje wyłączenie różnorodności i ustawienie wyszukiwanych haseł jako "Engineer"

search_jobs.py (poziom zróżnicowania)

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

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

Uruchom polecenie search_jobs.py, a zobaczysz nieco inną kolejność – zlecenia inżyniera są teraz bliżej siebie.

$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;...

Udało Ci się oficjalnie nauczyć, jak wysyłać zapytania w interfejsie Job Search API.

Omawiane zagadnienia

  • Konfiguruję projekt Cloud
  • Konfigurowanie środowiska programistycznego
  • Zapytania dotyczące ofert pracy
  • Dodaj obiekt JobQuery z parametrami wyszukiwania
  • Ogranicz ilość danych zwracanych za pomocą zadania viewView
  • Podział na strony
  • Automatycznie sprawdzanie pisowni zapytania
  • Polecane zadania
  • Dostosowywanie pod kątem trafności w sieci wyszukiwania
  • Położenie geograficzne
  • Słowa kluczowe i poszerzanie zakresu danych
  • Różnorodność

Więcej informacji