Job Search API mit Google Cloud abfragen

In diesem Codelab erfahren Sie, wie Sie die Jobsuche und die Talentakquise mit dem Cloud Talent Solution API (CTS) für Ihre Organisation verbessern können. Mithilfe von CTS können Sie die Jobsuche mit leistungsstarken Funktionen für maschinelles Lernen kombinieren.

Lerninhalte

  • CTS in Ihrem Google Cloud-Projekt aktivieren
  • Offene Jobs mit der Job Search API abfragen

Voraussetzungen

  • Ein Google Cloud-Projekt mit eingerichteter Abrechnung. Wenn Sie noch kein Projekt haben, erstellen Sie eins.
  • Etwa eine Stunde

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und die Übungen abschließen

Wie würdest du deine bisherigen Erfahrungen mit der Google Cloud Platform bewerten?

Neuling Fortgeschritten Experte

Diese Anleitung soll vollständig auf der Google Cloud Platform ausgeführt werden. Es sind keine Downloads auf Ihre Workstation erforderlich.

Cloud Talent Solutions API aktivieren

Öffnen Sie die Anwendung in der Cloud Console und klicken Sie oben links auf das Dreistrich-Menü. Rufen Sie die Menüs Talent Solution -> Overview auf.

Da es sich um ein neues Projekt handelt, werden Sie zu einem neuen Bildschirm weitergeleitet, auf dem Sie aufgefordert werden, die API zu aktivieren. Klicken Sie auf „Aktivieren“ und warten Sie einige Minuten, bis die API für dieses Projekt aktiviert wird.

Daten-Logging aktivieren

Kehren Sie nun zur vorherigen Übersichtsseite zurück. Ein neues Dialogfeld erscheint, in dem Sie aufgefordert werden, das Daten-Logging zu aktivieren. Hierdurch wird lediglich sichergestellt, dass die Job Search API auf einem ML-Modell basiert, das Daten benötigt. Im Rahmen der Integration können Sie Ereignisse von Nutzern senden, die diese Modelle weiter trainieren möchten. Wenn dies über Code implementiert wird, können Sie angeben, welche Informationen gesendet werden.

Wir sehen uns genauer an, was diese Ereignisse sind und wie sie später gesendet werden. Aber die vortrainierten Modelle funktionieren gut. Aktivieren Sie die Datenprotokollierung und klicken Sie dann im linken Navigationsbereich dieses Dialogfelds auf „Dienstkontoverbindungen“.

Dienstkonto einrichten

Wenn Sie API-Anfragen senden, müssen Sie diese im Namen eines tatsächlich authentifizierten Kontos stellen. Für die Best Practices für die Google Cloud Platform empfehlen wir, ein Dienstkonto dafür einzurichten. Mit Dienstkonten können Sie leicht authentifizierte Nutzer mit eingeschränkten Berechtigungen einrichten. Dies hilft Ihnen beim Aufbau eines unabhängigen und sicheren Systems.

Beispiel: Wir benötigen ein Dienstkonto, um die Job Search API zu verwenden. Jetzt erstellen! Nach dem Klicken auf „Dienstkontoverbindungen“ klicken Sie oben auf der Seite auf „Dienstkonten verwalten“ und dann auf „Dienstkonto erstellen“. ihm die Lese-/Schreibberechtigung mit dem Jobeditor und im linken Menü unter „Cloud Talent Solution“ zuweisen. Es ist auch möglich, ein Dienstkonto nur mit „Job-Betrachter“ einzurichten. So wäre es nur schreibgeschützt.

Im nächsten Schritt werden Sie gefragt, ob Sie Nutzern Zugriff auf dieses Dienstkonto gewähren möchten. Sie können diesen Schritt überspringen, aber unten auf „+ Schlüssel erstellen“ klicken. Eine neue JSON-Anmeldedatendatei wird automatisch heruntergeladen. Speichern Sie diese Datei auf Ihrem Server. Der Code, den Sie später schreiben, wird zur Authentifizierung verwendet.

Umgebungsvariablen festlegen

Der Einfachheit halber verwenden wir Google Cloud Shell. Würdest du das aus deiner eigenen Entwicklungsumgebung machen? Installieren Sie das Google Cloud SDK und die Clientbibliotheken in der Sprache Ihrer Wahl. In diesem Codelab wird Python verwendet. In Cloud Shell sind die Cloud-Clientbibliotheken bereits installiert. Praktisch, oder?

Wenn Sie Code mithilfe der Bibliotheken ausführen möchten, müssen Sie zwei Umgebungsvariablen festlegen: eine für die Projekt-ID und die andere für die Schlüsseldatei Ihres Dienstkontos. Das legen wir fest.

Klicken Sie bei Ihrem Projekt auf das Symbol >_" rechts oben in der Webkonsole, um eine Cloud Shell zu öffnen. Fügen Sie die folgenden Umgebungsvariablen hinzu, um Ihre Projekt-ID anzugeben und einen Pfad zu Ihrer JSON-Schlüsseldatei festzulegen:

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

Bevor wir eine Suche nach Jobs im System durchführen, müssen wir einige davon überprüfen.

Sie möchten wissen, wie Sie Unternehmen und Jobs mithilfe der API hinzufügen können? Du kannst jetzt das Codelab zu diesem Thema durchführen. Andernfalls werden Sie in diesem Abschnitt Schritt für Schritt erklärt.

Code-Editor in Cloud Shell öffnen

Öffnen Sie Cloud Shell über das Cloud Shell-Symbol oben rechts in der Google Cloud Console.

Rechts oben in Cloud Shell sehen Sie eine Reihe von Symbolen. Klicken Sie auf Datei -> Code-Editor starten, wie hier gezeigt:

Unternehmen und Jobs erstellen

Erstellen Sie mit File -> Neue Datei eine neue Quelldatei und füllen Sie sie mit dem Inhalt unten aus. Nennen Sie sie create_some_jobs.py.

Die Verwendung der API zum Erstellen von Unternehmen und Jobs wird in diesem Codelab nicht berücksichtigt. Das vorherige Codelab, Job Search API, zeigt Ihnen, wie das geht. Mit dem folgenden Code werden im System nur einige Jobs erstellt, sodass wir mit verschiedenen Funktionen der Search API experimentieren und herausfinden können, welche Ergebnisse auftreten.

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

Führen Sie den Code oben aus der Konsole aus.

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

Für jede Suche müssen wir zwei Objekte angeben: Request und RequestMetadata.

Zuerst konzentrieren wir uns auf die Anfragemetadaten.

Das RequestMetadata-Objekt enthält Informationen zu dem Nutzer, der die Suchanfrage stellt. Es ist wichtig, diese Details anzugeben, um eine konsistente Nutzererfahrung zu gewährleisten und das Machine Learning-Modell besser zu trainieren.

Die folgenden vier Attribute bilden das Anfrageobjekt:

  • domain (erforderlich) die Domain, von der die Suche gehostet wird, z. B. foo.com.
  • sessionId (erforderlich): ein eindeutiger Identifikationsstring für eine Sitzung. Die Sitzung ist die Dauer einer Interaktion des Endnutzers mit dem Dienst über einen bestimmten Zeitraum.
  • userId (erforderlich): ein eindeutiger Identifikationsstring, der den Nutzer darstellt.
  • deviceInfo (optional) besteht aus der ID und dem Gerätetyp. So können Sie beispielsweise zwischen einer Websuche und einer App-Suche unterscheiden.

Die vollständige Liste der Felder sowie Typ- und Beschreibungsinformationen finden Sie auch in der Dokumentation zu RequestMetadata.

Für die Suche benötigen Sie mindestens die folgenden Schritte:

  1. unser RequestMetadata-Objekt definieren
  2. Nehmen Sie diese RequestMetadata und fügen Sie sie in ein "request"-Objekt ein.
  3. Suchen Sie nach der Jobs API und verwenden Sie diese Anfrage als Definition der Abfrage
  4. Prüfen Sie die Ergebnisse.

Sehen wir uns jetzt das Ergebnis an. Öffnen Sie die neue Datei search_jobs.py und fügen Sie den folgenden Code ein:

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

Versuchen Sie es mit dieser Suche!

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

Er hat jeden Job im System zurückgegeben.

Warum?

Weil du noch keine Suchparameter angegeben hast! Aber wie können Sie das schaffen? Wenn nur der nächste Abschnitt etwas beschreibt, das nicht nur hilfreich, sondern absolut notwendig für die Suche in einer Datenbank ist. Zum Beispiel:

JobQuery-Objekt mit Suchparametern hinzufügen

Eigentlich sind RequestMetadata das einzige Pflichtfeld, aber häufiger möchten wir nach etwas suchen. Daher enthalten wir auch eine JobQuery. Die JobQuery kann ein ziemlich einfaches Objekt mit einem Abfragestring für die tatsächlichen Suchbegriffe und verschiedenen Filtern sein, um die zurückgegebenen Jobs einzugrenzen. Sie können z. B. nur Jobs von einem bestimmten Unternehmen zurückgeben oder nach Beschäftigungsarten filtern. Wir verwenden momentan nur den Abfragestring, aber es gibt weitere Informationen zu den Filtern, die in der JobQuery-Dokumentation verfügbar sind.

Ändern Sie den Code zuvor, um eine JobQuery hinzuzufügen, und fügen Sie sie Ihrer vorhandenen Anfrage hinzu.

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

Führen Sie die Suche dann noch einmal aus.

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

Besser! und zwar auf verschiedene Arten. Lass uns herausfinden, was passiert ist:

  • Die Search API hat den Abfrageparameter verwendet und hat nur ein passendes Ergebnis zurückgegeben
  • Das zurückgegebene Ergebnis enthielt ein HTML-formatiertes Snippet mit dem passenden Suchbegriff fett, um die Anzeige in der Liste der Suchergebnisse zu erleichtern.
  • Das Hinzufügen einer Suchanfrage bestand nur aus zwei zusätzlichen Codezeilen.

Die grundlegende Jobsuche ist nun eingerichtet. Sie können Abfragen für eine Jobdatenbank ausführen und Ergebnisse abrufen. Aber es gibt noch viele weitere Neuerungen.

Mit JobView Daten zurückgeben

Sie können auch eine jobView-Property angeben. Das ist eine ENUM, die angibt, wie viele Informationen Sie mit Ihrer Suchanfrage abrufen möchten. JOB_VIEW_FULL enthält alle Informationen zu den einzelnen Jobergebnissen. Sie können jedoch einige Byte speichern und eine andere Option mit weniger Feldern auswählen. Wähle die Option aus, die für die Plattform am sinnvollsten ist. Mögliche Werte (aus der JobView-Dokumentation):

  • JOB_VIEW_UNSPECIFIED – Standard.
  • JOB_VIEW_ID_NUR – Enthält nur den Jobnamen, die Anforderungs-ID und den Sprachcode.
  • JOB_VIEW_MINIMAL – Alles in der Ansicht „ID_only“ sowie Titel, Name des Unternehmens und Standorte.
  • JOB_VIEW_PLACEHOLDER – alles in der MINIMAL-Ansicht sowie Sichtbarkeit und die Stellenbeschreibung
  • JOB_VIEW_FULL – alle verfügbaren Attribute.

Ausführliche Informationen zu den verfügbaren Feldern finden Sie in der Dokumentation zu Job, dem in den Suchergebnissen zurückgegebenen Objekt. Im Folgenden finden Sie ein Beispiel für die Angabe von JobView in Ihrem Anfrageobjekt.

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

Hier wird für den Zweck dieses Codelabs auf JOB_VIEW_FULL festgelegt. Das liegt daran, dass die Anzahl der abgefragten Jobs und die Anzahl der gleichzeitigen Nutzer recht gering sind und wir die verfügbaren Felder einfacher untersuchen können. In der Produktion sollten Sie eine JobView mit einer leichteren Nutzlast verwenden, die einen Index der Suchergebnisse erstellt, da sie weniger unnötige Bandbreite benötigt.

Paginat

Da Sie möglicherweise viele Ergebnisse erhalten, wird die API auch zur Paginierung hinzugefügt, damit Sie mit einer Oberfläche zur Paginierung arbeiten können. Wir empfehlen, die Seitengröße auf 20 oder weniger zu setzen, um Latenzprobleme zu vermeiden und Seitenumbrüche immer über die API zu verwenden, statt alle Ergebnisse zu laden. Sie erhalten ein nextPageToken in der Antwort, wenn es weitere Jobs gibt, sodass Sie es an die nächste Suchanfrage weiterleiten können.

Auch diese Anpassung an den Suchergebnissen erfolgt durch Hinzufügen eines einzigen Felds zur Anfrage und Angabe der gewünschten Suchergebnisse pro Seite.

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

Führen Sie das Skript „search_jobs“ mit der Seite „Größe“ aus, die in der Anfrage mit „1“ gekennzeichnet ist. Wenn du diese Aktion ausführst, erhältst du nur ein Suchergebnis. Es gibt aber mehrere Stellenausschreibungen in deiner Datenbank. Wie bekommst du den Rest?

Bei mehr Ergebnissen als der aktuellen Antwort gibt es in der Antwort das Feld nextPageToken. Verwenden Sie diesen Wert, geben Sie ihn in Ihrer bestehenden Anfrage unter dem Namen pageToken zurück und führen Sie die Suche noch einmal aus. Hier sehen Sie ein Beispiel dafür.

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

Abfrage automatisch mit der Rechtschreibprüfung prüfen

Die Rechtschreibprüfung ist in die API integriert. Wenn Ihr Arbeitssuchender also nach dem Wort Manaer sucht, werden Ergebnisse für Einträge mit dem Wort „Manager“ zurückgegeben.

Dieses Feature ist standardmäßig aktiviert. Wenn Sie es deaktivieren möchten, fügen Sie Ihrer JobQuery das Feld disableSpellCheck hinzu und setzen Sie es auf „true“.

search_jobs.py

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

Führen Sie diesen Befehl aus. Wenn dieses Flag fehlt, gibt „&Engineer“ die Ergebnisse zurück, die den String „Engineer“ enthalten. Wenn die Rechtschreibprüfung deaktiviert ist, gibt dieselbe Abfrage keine Ergebnisse zurück.

Als Nächstes sehen wir uns einige Möglichkeiten an, wie die Relevanz von Suchergebnissen angepasst werden kann.

Die Google Cloud Talent Solution Job Search API nutzt Machine Learning (ML), um die Relevanz von Stellenangeboten zu bestimmen, wenn ein Nutzer nach Stellenangeboten sucht.

Jobs und Unternehmen haben mehrere Properties, auf die mithilfe der Modelle für maschinelles Lernen die Relevanz von Suchergebnissen ermittelt wird. Du kannst diese Relevanz erheblich beeinflussen, indem du mehr Informationen zur Verfügung stellst oder Dinge wie empfohlene Jobs verwendest. Die Relevanz der Suchergebnisse kann schwierig zu messen sein, insbesondere weil verschiedene Dinge für unterschiedliche Nutzer relevant sind. Die Job Search API verwendet einen Algorithmus basierend auf einigen Signalen aus den Jobdaten. Sehen wir uns nun an, wie sich einige dieser Signale auf die Suchergebnisse auswirken.

Unter „Hervorgehobene Jobs“ können Sie die Suchergebnisse Ihrer Nutzer beeinflussen. Rankings von Jobs werden dabei nach ihrem Wert und nicht nur nach Relevanz sortiert. Wenn Sie nach „Empfohlene Jobs“ suchen, werden nur relevante Jobs mit einem zugewiesenen Angebotswert zurückgegeben.

„Hervorgehobene Jobs“ ist nützlich, wenn Sie die Möglichkeit haben möchten, einzelne Jobs in Ihrem Index zu fördern. Beispielsweise können auf einer Karrierewebsite, die für geschäftskritische Jobs wirbt, eine Suche nach empfohlenen Jobs angezeigt werden, um nur gesponserte Jobs an Stellensuchende zurückzugeben.

Zum Definieren eines Jobs als „ausgewählt“ wird das Feld promotionValue in der Jobdefinition verwendet, wenn Sie einen Job erstellen oder aktualisieren. Im Skript create_some_jobs.py, das wir weiter oben in diesem Codelab verwendet haben, wurde einer der Jobs mit einem Angebotswert erstellt. Fügen Sie das Snippet noch einmal mit der entsprechenden Zeile in den Kommentaren ein:

create_some_jobs.py erstellen

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

Der Wert der Werbeaktion kann eine beliebige ganze Zahl zwischen 1 und 10 sein. Wenn Sie den Suchmodus zu FEATURED_JOB_SEARCH ändern (siehe unten), werden die Suchergebnisse auf zwei Arten beeinflusst:

  • Es werden nur Jobs mit einem promotionalValue > 0 angezeigt.
  • Jobs werden in absteigender Reihenfolge nach promotionalValue sortiert. Jobs mit demselben promotionalValue werden nach Relevanz (sortiert vom Suchalgorithmus) sortiert.
   request = {
       'searchMode': 'FEATURED_JOB_SEARCH',
       'requestMetadata': request_metadata,
       'jobQuery': job_query,
       'jobView' : 'JOB_VIEW_FULL'
   }

Aktualisieren Sie Ihre Anfrage, um den Suchmodus auf FEATURED_JOB_SEARCH festzulegen. Führen Sie dann den Code aus und Sie sollten in etwa folgende Ausgabe sehen:

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

Der Job mit einem promotionValue, der explizit über 0 festgelegt ist, ist das einzige zurückgegebene Ergebnis.

Geografischer Standort

Eine der wichtigsten Properties ist der geografische Standort. Sowohl Unternehmen als auch Jobs haben Standort-Properties, aber der Jobstandort wird gegenüber dem Unternehmensstandort verwendet, wenn ein Nutzer sucht. Sie sollten das Feld „address“ für Jobs und Unternehmen verwenden, damit die API die Standortbestimmung verwenden kann, um die relevantesten Jobs für eine Suche zurückzugeben. Wenn jemand nach „Berlin“ sucht, möchte er vermutlich in erster Linie nach Stellenangeboten in Berlin suchen.

In unserem Beispieljob ist die Position als leitender Softwareentwickler bei FooCorp das Standortfeld „Mountain View, Kalifornien“. Der Code dafür lautet:

create_some_jobs.py (wobei der Standort in FooCorp definiert ist)

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

Der Name einer Stadt ist gut, aber für die besten Ergebnisse musst du eine vollständige Adresse angeben.

Es ist zwar technisch optional, aber das Hinzufügen eines Standorts ermöglicht viele nützliche Funktionen für Stellensuchende. CTS wandelt diese Adresse für Sie in einen Breitengrad/Längengrad um und verwendet sie als Suchsignal. So würden Sie zum Beispiel die JobQuery so anpassen, dass eine Suche nach Jobs im Bereich Palo Alto mit einer maximalen Entfernung von beispielsweise 16 km ausgeführt wird:

search_jobs.py (Suche nach Jobs in/in der Nähe von Palo Alto)

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

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

Führen Sie diesen Code aus und denk daran, dass wir irgendwo in unserem Code zur Joberstellung schon einmal Palo Alto erwähnt haben. Keine Stellenbeschreibung, Name des Unternehmens, nichts

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

Die Suche hat ein Ergebnis zurückgegeben. Weil Palo Alto maximal 16 km vom Auftrag entfernt ist (die 10 Meilen ist die im LocationFilter definierte Grenze)

Es gibt noch einige weitere lustige Dinge, die du mit diesem Ort nicht tun kannst. Sehen Sie sich einfach Folgendes an:

  • Arbeitswegbasierte Suche: Hiermit können Sie nach Jobs in einem Gebiet suchen, das durch die Arbeitszeit und nicht durch die Entfernung definiert ist. Vielleicht wäre es ja toll, wenn du auch Wir alle. Wir alle.
  • Suche mit mehreren Orten: Dies ist die Art, wie Sie nach Jobs in mehreren Städten gleichzeitig suchen.

Keywords und Erweiterung

Natürlich sind der Titel und die Beschreibung einer Stelle entscheidend dafür, ob sie für eine Suchanfrage geeignet ist. Wenn eine Stelle mit dem Scrumb-Master veröffentlicht wird und in der Beschreibung die Verwaltung von Softwareentwicklern erwähnt wird, muss nach einer Suche nach „Software Development Manager“ gesucht werden. Vermeiden Sie es, eine überflüssige Wortgruppe in eine Stellenbeschreibung zu kopieren. Andernfalls werden Ihnen möglicherweise weniger relevante Jobs angezeigt.

Die API bietet außerdem einige Parameter, die Sie bei der Suche weitergeben können, um die Ergebnisse besser zu steuern. Sie können Keyword-Optionen aktivieren oder deaktivieren, falls die Suche über die regulären ML-basierten Suchergebnisse hinausgeht. Außerdem werden einige der standortspezifischen Filter gelockert. Durch die Ausweitung der Suche wird der Suchbereich für die angegebenen Parameter erweitert, sodass Sie mehr Ergebnisse für eine Suche erhalten.

Hier ein Beispiel dafür. Führen Sie vor der Suche mit dem Suchbegriff „Agile" ohne Erweiterung aus. Wenn Sie Ihr Unternehmen und Ihre Jobs mit dem Skript in diesem Codelab erstellt haben, passiert nichts. Warum? Das Wort „agil“ ist in keinem Eintrag enthalten. Es handelt sich jedoch um eine beliebte Methodik im Zusammenhang mit dem Programmieren.

Aktivieren Sie die Keyword-Erweiterung und sehen Sie, was sich ändert.

search_jobs.py (mit aktivierter Erweiterung)

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

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

Führen Sie nun das Skript erneut aus, um die Ergebnisse zu sehen.

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

Wie können wir nun feststellen, dass es sich nicht nur um eine pauschale Flagge handelt, um alle Punkte zurückzugeben? Ersetzen Sie „Agile“ durch einige Synonyme, z. B. „quot;sprightly"“, „&extt;dexterous“ sowie „&t“;lively" oder „quot;swift;“. In keinem Fall wird etwas angezeigt.

Es gibt jedoch einen Kompromiss bei der Erweiterung. Auf der Seite mit den Best Practices für die Jobsuche ist deutlich angegeben, dass die Anzahl der Suchergebnisse durch die Aktivierung dieses Parameters erhöht wird, möglicherweise aber die Relevanz der Gesamtergebnisse verringert wird. Bei dieser Funktion besteht das Risiko, dass die Quantität auf Kosten der Qualität sinkt. Andererseits kann es auch hilfreich sein, wenn der Jobsuchende das Gesuchte leicht findet.

Diversifizierung

Manchmal werden in den Suchergebnissen mehrere ähnlich ähnliche Jobs zurückgegeben. Dies kann sich nachteilig für den Arbeitssuchenden auswirken, sodass er die verfügbaren Ergebnisse möglicherweise nicht sieht.

Mit der Diversifizierung wurde der Fehler behoben. Jobs werden anhand des Titels, der Jobkategorien und der Standorte als ähnlich gekennzeichnet. Sehr ähnliche Ergebnisse werden dann gruppiert, sodass nur ein Job aus dem Cluster weiter oben in den Suchergebnissen angezeigt wird. Vielleicht hast du schon bei der Suche nach „Engineer“ bemerkt, dass du folgende Ergebnisse erhalten hast:

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

Warum ist die Bestellung so bestellt? Die Jobs des Softwareentwicklers stammen von zwei verschiedenen Unternehmen (HorseHub und FooCorp) und haben unterschiedliche Beschreibungen. Sie sind beide Softwareingenieure, aber sie unterscheiden sich voneinander, um in den Suchergebnissen voneinander nah beieinander zu liegen.

Wenn Sie sich jedoch die Einträge „Test Engineer“ ansehen, werden tatsächlich genau dieselben Einträge für dasselbe Unternehmen doppelt gepostet. Da die Diversifizierung standardmäßig aktiviert ist, wurde der zweite Test Engineer-Eintrag als weniger wichtig eingestuft, obwohl er technisch relevanter ist als andere, potenziell interessantere Einträge.

Bei der Diversifizierungsstufe gibt es drei mögliche Einstellungen. Sie wählen aber nur eine davon aus. Sie sind:

  • DIVERSIFICATION_LEVEL_UNSPECIFIED – bedeutet nur, dass Sie keine Stufe angegeben haben und sie das Standardverhalten übernehmen sollte (derzeit ist die gleiche Funktionsweise wie SIMPLE)
  • DISABLED – Diversifizierung deaktiviert – Jobs, die normalerweise auf die letzte Seite verschoben werden, weil sie zu ähnlich sind, werden nicht geändert.
  • EINFACH – diversifizierendes Verhalten. Die Ergebnisliste ist so angeordnet, dass sehr ähnliche Ergebnisse an das Ende der letzten Seite der Suchergebnisse verschoben werden.

Hier sehen Sie, wie Sie das DiversifizierungLevel Ihrer Anfrage explizit festlegen würden. Sie müssen nur Ihre Anfrage anpassen, wie die meisten anderen Probleme mit den Einstellungen in diesem Codelab. Probieren Sie die folgenden Einstellungen für die Jobanfrage und die Anfrage aus. Dadurch wird die Diversifizierung deaktiviert und der Suchbegriff auf "Engineer" gesetzt.

search_jobs.py (Diversitätsstufe)

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

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

Führen Sie jetzt „search_jobs.py“ aus und die Reihenfolge ist etwas anders. Die Tests sind jetzt näher beieinander.

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

Sie wissen jetzt, wie Sie mit der Job Search API Jobs anfordern.

Behandelte Themen

  • Cloud-Projekt einrichten
  • Entwicklungsumgebung einrichten
  • Jobs abfragen
  • JobQuery-Objekt mit Suchparametern hinzufügen
  • Mit JobView zurückgegebene Daten beschränken
  • Paginat
  • Abfrage automatisch auf Rechtschreibung prüfen
  • Hervorgehobene Jobs
  • Anpassung an die Suchrelevanz
  • Geografischer Standort
  • Keywords und Erweiterung
  • Diversifizierung

Weitere Informationen