Ein Inhaltsconnector ist ein Softwareprogramm, mit dem die Daten im Repository eines Unternehmens durchsucht und eine Datenquelle ausgefüllt wird. Google bietet Ihnen die folgenden Möglichkeiten, Inhaltsconnectors zu entwickeln:
Das Content Connector SDK Diese Option bietet sich an, wenn Sie in Java programmieren. Das Content Connector SDK ist ein Wrapper für die REST API, mit dem Sie schnell Connectors erstellen können. Informationen zum Erstellen eines Inhaltsconnectors mit dem SDK finden Sie in diesem Artikel.
Eine Low-Level-REST API oder API-Bibliotheken. Verwenden Sie diese Optionen, wenn Sie nicht in Java programmieren oder für Ihre Codebasis eine REST API oder eine Bibliothek besser geeignet ist. Informationen zum Erstellen eines Inhaltsconnectors mit der REST API finden Sie unter Mithilfe der REST API Inhaltsconnectors erstellen.
Mit einem typischen Inhaltsconnector werden die folgenden Aufgaben ausgeführt:
- Liest und verarbeitet Konfigurationsparameter.
- Dadurch werden einzelne Datensegmente, sogenannte Elemente, aus dem Repository des Drittanbieters abgerufen.
- Kombiniert ACLs, Metadaten und Inhaltsdaten in indexierbaren Elementen.
- Die Elemente werden der Cloud Search-Datenquelle indexiert.
- (Optional) Wartet auf Änderungsbenachrichtigungen aus dem Repository des Drittanbieters. Änderungsbenachrichtigungen werden in Indexierungsanfragen umgewandelt, um die Cloud Search-Datenquelle mit dem Drittanbieter-Repository zu synchronisieren. Diese Aufgabe wird nur ausgeführt, wenn das Repository die Änderungserkennung unterstützt.
Mit dem Content Connector SDK Inhaltsconnectors erstellen
In den folgenden Abschnitten wird erläutert, wie Sie mit dem Content Connector SDK einen Inhaltsconnector erstellen.
Abhängigkeiten einrichten
Sie müssen bestimmte Abhängigkeiten in Ihre Build-Datei aufnehmen, um das SDK verwenden zu können. Klicken Sie unten auf einen Tab, um die Abhängigkeiten für Ihre Build-Umgebung anzusehen:
Maven
<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-indexing-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>
Gradle
compile group: 'com.google.enterprise.cloudsearch',
name: 'google-cloudsearch-indexing-connector-sdk',
version: 'v1-0.0.3'
Connector-Konfiguration erstellen
Jeder Connector hat eine Konfigurationsdatei mit Parametern, die vom Connector verwendet werden, z. B. die ID für Ihr Repository. Parameter werden als Schlüssel/Wert-Paare definiert, z. B. api.sourceId=1234567890abcdef
.
Das Google Cloud Search SDK enthält mehrere von Google bereitgestellte Konfigurationsparameter, die von allen Connectors verwendet werden. Sie müssen die folgenden von Google bereitgestellten Parameter in Ihrer Konfigurationsdatei angeben:
- Für einen Inhaltsconnector benötigen Sie die Parameter
api.sourceId
undapi.serviceAccountPrivateKeyFile
, da diese den Speicherort Ihres Repositorys und des für den Zugriff nötigen privaten Schlüssels angeben.
- Für einen Identitätsconnector benötigen Sie den Parameter
api.identitySourceId
, da dieser den Speicherort Ihrer externen Identitätsquelle angibt. Wenn Sie Nutzer synchronisieren, müssen Sieapi.customerId
auch als eindeutige ID für das Google Workspace-Konto Ihres Unternehmens deklarieren.
Wenn Sie die Standardwerte anderer von Google bereitgestellter Parameter nicht überschreiben möchten, müssen Sie sie auch nicht in Ihrer Konfigurationsdatei angeben. Weitere Informationen zu den von Google bereitgestellten Konfigurationsparametern, z. B. wie Sie bestimmte IDs und Schlüssel generieren, finden Sie in diesem Artikel.
Sie können auch eigene Repository-spezifische Parameter für Ihre Konfigurationsdatei definieren.
Konfigurationsdatei an den Connector übergeben
Legen Sie die Systemeigenschaft config
fest, um die Konfigurationsdatei an Ihren Connector zu übergeben. Dazu verwenden Sie beim Starten des Connectors das Argument -D
. Mit dem folgenden Befehl wird der Connector beispielsweise mit der Konfigurationsdatei MyConfig.properties
gestartet:
java -classpath myconnector.jar;... -Dconfig=MyConfig.properties MyConnector
Wenn dieses Argument fehlt, versucht das SDK, auf eine Standardkonfigurationsdatei mit dem Namen connector-config.properties
zuzugreifen.
Durchlaufstrategie festlegen
Die Hauptfunktion eines Inhaltsconnectors besteht darin, ein Repository zu durchsuchen und die zugehörigen Daten zu indexieren. Sie müssen eine Durchlaufstrategie implementieren, die auf der Größe und dem Layout der Daten in Ihrem Repository basiert. Sie können Ihre eigene Strategie entwerfen oder eine der folgenden im SDK implementierten Strategien auswählen:
- Durchlauf mit vollständiger Indexierung (Full Traversal)
Bei einer Strategie für das Durchlauf mit vollständiger Indexierung wird das gesamte Repository gescannt und blindlings jedes Element indexiert. Diese Strategie wird häufig verwendet, wenn Sie ein kleines Repository haben und sich bei jedem Indexieren den Aufwand für einen vollständigen Durchlauf leisten können.
Diese Durchlaufstrategie eignet sich für kleine Repositories, die hauptsächlich statische, nicht hierarchische Daten enthalten. Diese Durchlaufstrategie eignet sich auch, wenn die Änderungserkennung schwierig ist oder vom Repository nicht unterstützt wird.
- Durchlauf mit Teilindexierung (List Traversal)
Bei einer List Traversal-Strategie wird das gesamte Repository, einschließlich aller untergeordneten Knoten, gescannt, um den Status der einzelnen Elemente zu bestimmen. Dann nimmt der Connector eine zweite Karte bzw. ein zweites Ticket auf und indexiert nur Elemente, die neu oder seit der letzten Indexierung aktualisiert wurden. Diese Strategie wird in der Regel verwendet, um inkrementelle Aktualisierungen für einen vorhandenen Index durchzuführen. Es muss also nicht jedes Mal ein Durchlauf mit vollständiger Indexierung durchgeführt werden, wenn Sie den Index aktualisieren.
Diese Durchlaufstrategie eignet sich, wenn die Änderungserkennung schwierig ist oder vom Repository nicht unterstützt wird, Sie nicht hierarchische Daten haben und mit sehr großen Datensätzen arbeiten.
- Graph Traversal
Bei einer Graph Traversal-Strategie wird der gesamte übergeordnete Knoten gescannt, um den Status der einzelnen Elemente zu bestimmen. Anschließend nimmt der Connector eine zweite Karte bzw. ein zweites Ergebnis auf und indexiert nur Elemente im Stammknoten, die neu sind oder seit der letzten Indexierung aktualisiert wurden. Schließlich übergibt der Connector alle untergeordneten IDs und indexiert die Elemente in den untergeordneten Knoten, die neu sind oder aktualisiert wurden. Der Connector geht rekursiv durch alle untergeordneten Knoten, bis alle Elemente angesprochen wurden. Ein derartiger Durchlauf wird normalerweise für hierarchische Repositories verwendet, bei denen das Auflisten aller IDs nicht praktikabel ist.
Diese Strategie eignet sich, wenn Sie hierarchische Daten haben, die gecrawlt werden müssen, z. B. Serienverzeichnisse oder Webseiten.
Jede dieser Durchlaufstrategien wird im SDK durch eine Vorlagenklasse für Connectors implementiert. Sie können zwar eine eigene Durchlaufstrategie implementieren, mit diesen Vorlagen wird die Entwicklung Ihres Connectors jedoch erheblich beschleunigt. Wenn Sie mithilfe einer Vorlage einen Connector erstellen möchten, lesen Sie den zu Ihrer Durchlaufstrategie passenden Abschnitt:
- Durchlauf mit vollständiger Indexierung mithilfe einer Vorlagenklasse erstellen
- List Traversal-Connector mithilfe einer Vorlagenklasse erstellen
- Graph Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Einen Durchlauf mit vollständigem Durchlauf mithilfe einer Vorlagenklasse erstellen
Dieser Abschnitt bezieht sich auf Code-Snippets aus dem Beispiel FullTraversalSample.
Einstiegspunkt des Connectors implementieren
Der Einstiegspunkt für einen Connector ist die Methode main()
. Sie dient hauptsächlich dazu, eine Instanz der Klasse Application
zu erstellen und die Methode start()
aufzurufen, um den Connector auszuführen.
Verwenden Sie die Klasse IndexingApplication.Builder
, um die Vorlage FullTraversalConnector
zu instanziieren, bevor Sie application.start()
aufrufen. Für FullTraversalConnector
wird ein Repository
-Objekt akzeptiert, dessen Methoden Sie implementieren. Das folgende Code-Snippet zeigt, wie die Methode main()
implementiert wird:
Im Hintergrund ruft das SDK die Methode initConfig()
auf, nachdem die Methode main()
Ihres Connectors Application.build
aufgerufen hat.
Über die Methode initConfig()
werden die folgenden Aufgaben ausgeführt:
- Die Methode
Configuation.isInitialized()
wird aufgerufen, um zu prüfen, obConfiguration
noch nicht initialisiert wurde. - Ein
Configuration
-Objekt wird mithilfe der von Google bereitgestellten Schlüssel/Wert-Paare initialisiert. Jedes dieser Paare wird in einemConfigValue
-Objekt innerhalb desConfiguration
-Objekts gespeichert.
Repository
-Schnittstelle implementieren
Die einzige Aufgabe des Repository
-Objekts besteht darin, Repository-Elemente zu durchsuchen und zu indexieren. Wenn Sie eine Vorlage verwenden, müssen Sie nur bestimmte Methoden in der Schnittstelle Repository
überschreiben, um einen Inhaltsconnector zu erstellen. Welche das sind, hängt von der verwendeten Vorlage und der Durchlaufstrategie ab. Überschreiben Sie für FullTraversalConnector
die folgenden Methoden:
Die Methode
init()
. Wenn Sie ein Daten-Repository einrichten und initialisieren möchten, überschreiben Sie die Methodeinit()
.Die Methode
getAllDocs()
. Wenn alle Elemente in einem Datenrepository durchlaufen und indexiert werden sollen, überschreiben Sie die MethodegetAllDocs()
. Diese Methode wird bei jedem geplanten Durchlauf einmal aufgerufen, wie in Ihrer Konfiguration definiert.Optional: Die Methode
getChanges()
. Wenn Ihr Repository die Änderungserkennung unterstützt, überschreiben Sie die MethodegetChanges()
. Sie wird für jeden geplanten inkrementellen Durchlauf (wie in Ihrer Konfiguration definiert) einmal aufgerufen, um die geänderten Elemente abzurufen und zu indexieren.Optional: Die Methode
close()
. Wenn Sie eine Repository-Bereinigung ausführen müssen, überschreiben Sie die Methodeclose()
. Sie wird einmal beim Herunterfahren des Connectors aufgerufen.
Für jede der Methoden des Repository
-Objekts wird ein Objekt des Typs ApiOperation
zurückgegeben. Ein ApiOperation
-Objekt führt eine Aktion in Form eines einzelnen oder möglicherweise mehrerer Aufrufe der Methode IndexingService.indexItem()
aus, um die tatsächliche Indexierung Ihres Repositorys zu veranlassen.
Benutzerdefinierte Konfigurationsparameter abrufen
Im Rahmen der Konfiguration der Konnektivität des Connectors müssen Sie alle benutzerdefinierten Parameter aus dem Configuration
-Objekt abrufen. Diese Aufgabe wird normalerweise in der Methode init()
der Klasse Repository
ausgeführt.
Die Klasse Configuration
bietet unterschiedliche Methoden, unterschiedliche Datentypen aus einer Konfiguration abzurufen. Bei jeder Methode wird ein ConfigValue
-Objekt zurückgegeben. Anschließend verwenden Sie die Methode get()
des ConfigValue
-Objekts, um den tatsächlichen Wert abzurufen.
Das folgende Snippet aus FullTraversalSample
zeigt, wie eine einzelne benutzerdefinierte Ganzzahl aus einem Configuration
-Objekt abgerufen wird:
Verwenden Sie zum Abrufen und Parsen eines Parameters mit mehreren Werten einen der Typen-Parser der Configuration
-Klasse, um die Daten in separate Segmente zu parsen.
Das folgende Snippet aus dem Connectorbeispiel des Tutorials zeigt, wie Sie mithilfe der Methode getMultiValue
eine Liste mit Namen von GitHub-Repositories erhalten:
Vollständigen Durchlauf (Full Traversal) durchführen
Überschreiben Sie getAllDocs()
, um einen vollständigen Durchlauf (Full Traversal) durchzuführen und das gesamte Repository zu indexieren. An die Methode getAllDocs()
kann ein Prüfpunkt übergeben werden. Dieser ermöglicht es, die Indexierung bei einem bestimmten Element fortzusetzen, sollte der Prozess unterbrochen werden. Führen Sie für jedes Element in Ihrem Repository die folgenden Schritte in der Methode getAllDocs()
aus:
- Legen Sie die Berechtigungen fest.
- Legen Sie die Metadaten für das zu indexierende Element fest.
- Kombinieren Sie die Metadaten und das Element in einer indexierbaren
RepositoryDoc
-Klasse. - Packen Sie jedes indexierbare Element in einen Iterator, der von der Methode
getAllDocs()
zurückgegeben wird. Beachten Sie, dassgetAllDocs()
einenCheckpointCloseableIterable
zurückgibt, eine Iteration des ObjektsApiOperation
. Jedes Objekt steht für eine API-Anfrage gegenüberRepositoryDoc
, z. B. für die Indexierung.
Wenn zu viele Elemente für einen einzigen Aufruf vorhanden sind, verwenden Sie einen Checkpoint und legen Sie hasMore(true)
fest, um anzugeben, dass noch mehr Elemente für die Indexierung verfügbar sind.
Berechtigungen für ein Element festlegen
Ihr Repository verwendet eine Zugriffssteuerungsliste (Access Control List, ACL), um die Nutzer oder Gruppen zu identifizieren, die Zugriff auf ein Element haben. Eine ACL besteht aus einer Liste mit den IDs der Gruppen oder Nutzer, die Zugriff auf das Element haben.
Sie müssen die von Ihrem Repository verwendete ACL duplizieren. So sorgen Sie dafür, dass nur Nutzer, die Zugriff auf ein Element haben, es auch in den Suchergebnissen sehen können. Die ACL für ein Element muss beim Indexieren angegeben werden, damit Google Cloud Search über die erforderlichen Informationen verfügt, um die korrekten Zugriffsberechtigungen für das Element bereitzustellen.
Im Content Connector SDK sind viele ACL-Klassen und ‐Methoden enthalten, mit denen sich die ACLs der meisten Repositories modellieren lassen. Dazu müssen Sie die ACL für jedes Element in Ihrem Repository analysieren und eine entsprechende ACL für Google Cloud Search erstellen. Wenn die ACL Ihres Repositorys Konzepte wie die ACL-Vererbung verwendet, kann die Modellierung dieser ACL knifflig sein. Weitere Informationen zu ACLs von Google Cloud Search finden Sie im Leitfaden ACLs zuordnen.
Hinweis:Die Cloud Search Indexing API unterstützt ACLs für einzelne Domains. Domainübergreifende ACLs werden nicht unterstützt. Verwenden Sie die Klasse Acl.Builder
, um den Zugriff auf die einzelnen Elemente über eine ACL festzulegen. Mit dem folgenden Code-Snippet, das einem Beispiel für einen vollständigen Durchlauf entspricht, können alle Nutzer oder „Hauptkonten“ (getCustomerPrincipal()
) zu Lesegeräten aller Elemente (.setReaders()
) werden, wenn sie eine Suche ausführen.
Mit ACLs können Sie ACLs für das Repository korrekt modellieren. Es ist möglich, dass Sie Dateien in einem Dateisystem indexieren, das eine Art Vererbungsmodell verwendet, bei dem untergeordnete Ordner Berechtigungen von übergeordneten Ordnern erben. Für die Modellierung der ACL-Vererbung sind zusätzliche Informationen erforderlich, die in den ACLs von Google Cloud Search behandelt werden.
Metadaten für ein Element festlegen
Metadaten werden in einem Item
-Objekt gespeichert. Um ein Item
-Objekt zu erstellen, benötigen Sie mindestens die folgenden Angaben: die eindeutige String-ID, den Elementtyp, die ACL, die URL und die Elementversion.
Das folgende Code-Snippet zeigt, wie ein Item
-Objekt mithilfe der Helper-Klasse IndexingItemBuilder
erstellt wird.
Indexierbares Element erstellen
Nachdem Sie die Metadaten für das Element festgelegt haben, können Sie mithilfe der Klasse RepositoryDoc.Builder
das tatsächliche indexierbare Element erstellen. Das folgende Beispiel zeigt, wie Sie ein einzelnes indexierbares Element erstellen.
RepositoryDoc
ist eine ApiOperation
, die die eigentliche IndexingService.indexItem()
-Anfrage ausführt.
Sie können auch die Methode setRequestMode()
der Klasse RepositoryDoc.Builder
verwenden, um die Indexierungsanforderung als ASYNCHRONOUS
oder SYNCHRONOUS
zu identifizieren:
ASYNCHRONOUS
- Im asynchronen Modus ist die Latenz zwischen Indexierung und Ausgabe höher, dafür kann er größere Mengen an Indexierungsanfragen verarbeiten. Der asynchrone Modus empfiehlt sich für die anfängliche Indexierung (Backfill) des gesamten Repositorys.
SYNCHRONOUS
- Im synchronen Modus ist die Latenz zwischen Indexierung und Ausgabe geringer, er eignet sich aber nur für begrenzte Durchsätze. Der synchrone Modus wird für die Indexierung von Updates und Änderungen am Repository empfohlen. Wenn keine Angabe erfolgt, wird standardmäßig der Modus
SYNCHRONOUS
verwendet.
Jedes indexierbare Element in einen Iterator verpacken
Die Methode getAllDocs()
gibt Iterator
zurück, genau genommen ein CheckpointCloseableIterable
von RepositoryDoc
-Objekten. Zum Erstellen und Zurückgeben eines Iterators können Sie die Klasse CheckpointClosableIterableImpl.Builder
verwenden. Im folgenden Code-Snippet sehen Sie, wie ein Iterator erstellt und zurückgegeben wird.
Das SDK führt jeden Indexierungsaufruf aus, der im Iterator enthalten ist.
Nächste Schritte
Als Nächstes könnten Sie Folgendes tun:
- Optional: Wenn Ihre Indexierung langsam erscheint, finden Sie hier weitere Informationen darüber, wie Sie die Indexierungsrate für
FullTraversalConnector
erhöhen. - Optional: Methode
close()
implementieren, damit vor dem Herunterfahren alle Ressourcen wieder freigegeben werden - Optional: Mit dem Content Connector SDK einen Identitätsconnector erstellen
List Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Diese Warteschlange enthält IDs und optionale Hashwerte für jedes Element im Repository. Mit dem List Traversal-Connector werden Element-IDs einer Indexierungswarteschlange in Google Cloud Search hinzugefügt und nacheinander für die Indexierung abgerufen. In Google Cloud Search werden Warteschlangen verwaltet und Inhalte verglichen, um den Status der Elemente zu ermitteln, beispielsweise, ob eines aus dem Repository gelöscht wurde. Weitere Informationen zur Cloud Search-Indexierungswarteschlange finden Sie unter Cloud Search-Indexierungswarteschlange.
Dieser Abschnitt bezieht sich auf Code-Snippets aus dem Beispiel ListTraversalSample.
Einstiegspunkt des Connectors implementieren
Der Einstiegspunkt für einen Connector ist die Methode main()
. Sie dient hauptsächlich dazu, eine Instanz der Klasse Application
zu erstellen und die Methode start()
aufzurufen, um den Connector auszuführen.
Verwenden Sie die Klasse IndexingApplication.Builder
, um die Vorlage ListingConnector
zu instanziieren, bevor Sie application.start()
aufrufen. Für ListingConnector
wird ein Repository
-Objekt akzeptiert, dessen Methoden Sie implementieren. Das folgende Snippet zeigt, wie die Klasse ListingConnector
und das dazugehörige Repository
instanziiert werden:
Im Hintergrund ruft das SDK die Methode initConfig()
auf, nachdem die Methode main()
Ihres Connectors Application.build
aufgerufen hat.
Die Methode initConfig()
:
- Die Methode
Configuation.isInitialized()
wird aufgerufen, um zu prüfen, obConfiguration
noch nicht initialisiert wurde. - Ein
Configuration
-Objekt wird mithilfe der von Google bereitgestellten Schlüssel/Wert-Paare initialisiert. Jedes dieser Paare wird in einemConfigValue
-Objekt innerhalb desConfiguration
-Objekts gespeichert.
Repository
-Schnittstelle implementieren
Die einzige Aufgabe des Repository
-Objekts besteht darin, Repository-Elemente zu durchsuchen und zu indexieren. Wenn Sie eine Vorlage verwenden, müssen Sie nur bestimmte Methoden in der Schnittstelle Repository
überschreiben, um einen Inhaltsconnector zu erstellen.
Welche das sind, hängt von der verwendeten Vorlage und der Durchlaufstrategie ab. Überschreiben Sie für ListingConnector
die folgenden Methoden:
Die Methode
init()
. Wenn Sie ein Daten-Repository einrichten und initialisieren möchten, überschreiben Sie die Methodeinit()
.Die Methode
getIds()
. Wenn Sie IDs und Hashwerte für alle Datensätze im Repository abrufen möchten, überschreiben Sie die MethodegetIds()
.Die Methode
getDoc()
. Wenn Sie im Index Elemente hinzufügen, bearbeiten oder löschen möchten, überschreiben Sie die MethodegetDoc()
.Optional: Die Methode
getChanges()
. Wenn Ihr Repository die Änderungserkennung unterstützt, überschreiben Sie die MethodegetChanges()
. Sie wird für jeden geplanten inkrementellen Durchlauf (wie in Ihrer Konfiguration definiert) einmal aufgerufen, um die geänderten Elemente abzurufen und zu indexieren.Optional: Die Methode
close()
. Wenn Sie eine Repository-Bereinigung ausführen müssen, überschreiben Sie die Methodeclose()
. Sie wird einmal beim Herunterfahren des Connectors aufgerufen.
Für jede der Methoden des Repository
-Objekts wird ein Objekt des Typs ApiOperation
zurückgegeben. Ein ApiOperation
-Objekt führt eine Aktion in Form eines einzelnen oder möglicherweise mehrerer Aufrufe der Methode IndexingService.indexItem()
aus, um die tatsächliche Indexierung Ihres Repositorys zu veranlassen.
Benutzerdefinierte Konfigurationsparameter abrufen
Im Rahmen der Konfiguration der Konnektivität des Connectors müssen Sie alle benutzerdefinierten Parameter aus dem Configuration
-Objekt abrufen. Diese Aufgabe wird normalerweise in der Methode init()
der Klasse Repository
ausgeführt.
Die Klasse Configuration
bietet unterschiedliche Methoden, unterschiedliche Datentypen aus einer Konfiguration abzurufen. Bei jeder Methode wird ein ConfigValue
-Objekt zurückgegeben. Anschließend verwenden Sie die Methode get()
des ConfigValue
-Objekts, um den tatsächlichen Wert abzurufen.
Das folgende Snippet aus FullTraversalSample
zeigt, wie eine einzelne benutzerdefinierte Ganzzahl aus einem Configuration
-Objekt abgerufen wird:
Verwenden Sie zum Abrufen und Parsen eines Parameters mit mehreren Werten einen der Typen-Parser der Configuration
-Klasse, um die Daten in separate Segmente zu parsen.
Das folgende Snippet aus dem Connectorbeispiel des Tutorials zeigt, wie Sie mithilfe der Methode getMultiValue
eine Liste mit Namen von GitHub-Repositories erhalten:
List Traversal durchführen
Überschreiben Sie die Methode getIds()
, um IDs und Hashwerte für alle Datensätze im Repository abzurufen.
An die Methode getIds()
kann ein Prüfpunkt übergeben werden. Dieser ermöglicht es, die Indexierung bei einem bestimmten Element fortzusetzen, sollte der Prozess unterbrochen werden.
Als Nächstes überschreiben Sie die Methode getDoc()
, um jedes Element in der Cloud Search-Indexierungswarteschlange zu verarbeiten.
Element-IDs und Hashwerte per Push übertragen
Überschreiben Sie getIds()
, um die Element-IDs und die zugehörigen Inhalts-Hashwerte aus dem Repository abzurufen. ID- und Hashwert-Paare werden dann in eine Push-Anforderung an die Cloud Search-Indexierungswarteschlange gepackt. Stamm- oder übergeordnete IDs werden normalerweise zuerst übertragen, gefolgt von untergeordneten IDs, bis die gesamte Hierarchie der Elemente verarbeitet wurde.
An die Methode getIds()
kann ein Prüfpunkt übergeben werden, der das letzte zu indexierende Element darstellt. Dieser ermöglicht es, die Indexierung bei einem bestimmten Element fortzusetzen, sollte der Prozess unterbrochen werden. Führen Sie für jedes Element in Ihrem Repository die folgenden Schritte in der Methode getIds()
aus:
- Rufen Sie jede Element-ID und den zugehörigen Hashwert aus dem Repository ab.
- Verpacken Sie jedes ID-Hashwert-Paar in eine
PushItems
-Klasse. - Kombinieren Sie alle
PushItems
in einem Iterator, der von der MethodegetIds()
zurückgegeben wird. Beachten Sie, dassgetIds()
tatsächlich einenCheckpointCloseableIterable
zurückgibt, eine Iteration des ObjektsApiOperation
. Jedes Objekt steht für eine API-Anfrage an einemRepositoryDoc
, z. B. Verschieben der Elemente in die Warteschlange.
Im folgenden Code-Snippet sehen Sie, wie IDs und Hashwerte abgerufen und in eine PushItems
-Klasse eingefügt werden.
PushItems
ist eine ApiOperation
-Anfrage, mit der ein Element in die Cloud Search-Indexierungswarteschlange aufgenommen wird.
Im folgenden Code-Snippet sehen Sie, wie Sie die Klasse PushItems.Builder
verwenden, um die IDs und Hashwerte in eine einzige Push-ApiOperation
zu verpacken.
Die Elemente werden zur weiteren Verarbeitung an die Cloud Search-Indexierungswarteschlange gesendet.
Jedes Element abrufen und verarbeiten
Überschreiben Sie die Methode getDoc()
, um jedes Element in der Indexierungswarteschlange von Cloud Search zu verarbeiten.
Ein Element kann neu, geändert, unverändert oder nicht mehr im Quell-Repository vorhanden sein. Jedes neu abgerufene oder geänderte Element abrufen und indexieren Entfernen Sie Elemente aus dem Index, die nicht mehr im Quell-Repository vorhanden sind.
Die Methode getDoc()
akzeptiert ein Element aus der Cloud Search-Indexierungswarteschlange. Führen Sie für jedes Element in der Warteschlange die folgenden Schritte in der Methode getDoc()
aus:
Prüfen Sie, ob im Repository die ID des Elements aus der Cloud Search-Indexierungswarteschlange vorhanden ist. Ist dies nicht der Fall, löschen Sie das Element aus dem Index.
Fragen Sie den Index nach dem Artikelstatus ab. Wenn ein Element unverändert bleibt (
ACCEPTED
), keine Aktion durchführen.Geänderter Index oder neue Elemente:
- Legen Sie die Berechtigungen fest.
- Legen Sie die Metadaten für das zu indexierende Element fest.
- Kombinieren Sie die Metadaten und das Element in einer indexierbaren
RepositoryDoc
-Klasse. - Geben Sie
RepositoryDoc
zurück.
Hinweis:Die Vorlage ListingConnector
unterstützt nicht die Rückgabe von null
für die Methode getDoc()
. Die Rückgabe von null
führt zu NullPointerException.
Umgang mit gelöschten Elementen
Im folgenden Code-Snippet sehen Sie, wie festgestellt werden kann, ob sich ein Element im Repository befindet, und es gegebenenfalls löschen.
documents
ist eine Datenstruktur, die das Repository darstellt. Wenn documentID
in documents
nicht gefunden wird, geben Sie APIOperations.deleteItem(resourceName)
zurück, um das Element aus dem Index zu löschen.
Umgang mit unveränderten Elementen
Im folgenden Code-Snippet wird gezeigt, wie Sie den Status von Elementen in der Cloud Search-Indexierungswarteschlange abfragen und mit unveränderten Elementen umgehen.
Prüfen Sie den Status des Elements sowie anderer Metadaten, die auf eine Änderung hinweisen könnten, um festzustellen, ob es unverändert ist. In diesem Beispiel wird anhand des Metadaten-Hashes ermittelt, ob das Element geändert wurde.
Berechtigungen für ein Element festlegen
Ihr Repository verwendet eine Zugriffssteuerungsliste (Access Control List, ACL), um die Nutzer oder Gruppen zu identifizieren, die Zugriff auf ein Element haben. Eine ACL besteht aus einer Liste mit den IDs der Gruppen oder Nutzer, die Zugriff auf das Element haben.
Sie müssen die von Ihrem Repository verwendete ACL duplizieren. So sorgen Sie dafür, dass nur Nutzer, die Zugriff auf ein Element haben, es auch in den Suchergebnissen sehen können. Die ACL für ein Element muss beim Indexieren angegeben werden, damit Google Cloud Search über die erforderlichen Informationen verfügt, um die korrekten Zugriffsberechtigungen für das Element bereitzustellen.
Im Content Connector SDK sind viele ACL-Klassen und ‐Methoden enthalten, mit denen sich die ACLs der meisten Repositories modellieren lassen. Dazu müssen Sie die ACL für jedes Element in Ihrem Repository analysieren und eine entsprechende ACL für Google Cloud Search erstellen. Wenn die ACL Ihres Repositorys Konzepte wie die ACL-Vererbung verwendet, kann die Modellierung dieser ACL knifflig sein. Weitere Informationen zu ACLs von Google Cloud Search finden Sie im Leitfaden ACLs zuordnen.
Hinweis:Die Cloud Search Indexing API unterstützt ACLs für einzelne Domains. Domainübergreifende ACLs werden nicht unterstützt. Verwenden Sie die Klasse Acl.Builder
, um den Zugriff auf die einzelnen Elemente über eine ACL festzulegen. Mit dem folgenden Code-Snippet, das einem Beispiel für einen vollständigen Durchlauf entspricht, können alle Nutzer oder „Hauptkonten“ (getCustomerPrincipal()
) zu Lesegeräten aller Elemente (.setReaders()
) werden, wenn sie eine Suche ausführen.
Mit ACLs können Sie ACLs für das Repository korrekt modellieren. Es ist möglich, dass Sie Dateien in einem Dateisystem indexieren, das eine Art Vererbungsmodell verwendet, bei dem untergeordnete Ordner Berechtigungen von übergeordneten Ordnern erben. Für die Modellierung der ACL-Vererbung sind zusätzliche Informationen erforderlich, die in den ACLs von Google Cloud Search behandelt werden.
Metadaten für ein Element festlegen
Metadaten werden in einem Item
-Objekt gespeichert. Um ein Item
-Objekt zu erstellen, benötigen Sie mindestens die folgenden Angaben: die eindeutige String-ID, den Elementtyp, die ACL, die URL und die Elementversion.
Das folgende Code-Snippet zeigt, wie ein Item
-Objekt mithilfe der Helper-Klasse IndexingItemBuilder
erstellt wird.
Indexierbare Elemente erstellen
Nachdem Sie die Metadaten für das Element festgelegt haben, können Sie mithilfe der Klasse RepositoryDoc.Builder
das tatsächliche indexierbare Element erstellen.
Das folgende Beispiel zeigt, wie Sie ein einzelnes indexierbares Element erstellen.
RepositoryDoc
ist eine ApiOperation
, die die eigentliche IndexingService.indexItem()
-Anfrage ausführt.
Sie können auch die Methode setRequestMode()
der Klasse RepositoryDoc.Builder
verwenden, um die Indexierungsanforderung als ASYNCHRONOUS
oder SYNCHRONOUS
zu identifizieren:
ASYNCHRONOUS
- Im asynchronen Modus ist die Latenz zwischen Indexierung und Ausgabe höher, dafür kann er größere Mengen an Indexierungsanfragen verarbeiten. Der asynchrone Modus empfiehlt sich für die anfängliche Indexierung (Backfill) des gesamten Repositorys.
SYNCHRONOUS
- Im synchronen Modus ist die Latenz zwischen Indexierung und Ausgabe geringer, er eignet sich aber nur für begrenzte Durchsätze. Der synchrone Modus wird für die Indexierung von Updates und Änderungen am Repository empfohlen. Wenn keine Angabe erfolgt, wird standardmäßig der Modus
SYNCHRONOUS
verwendet.
Nächste Schritte
Als Nächstes könnten Sie Folgendes tun:
- Optional: Methode
close()
implementieren, damit vor dem Herunterfahren alle Ressourcen wieder freigegeben werden - Optional: Mit dem Content Connector SDK einen Identitätsconnector erstellen
Graph Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Diese Warteschlange enthält IDs und optionale Hashwerte für jedes Element im Repository. Mit dem Graph Traversal-Connector werden Element-IDs einer Indexierungswarteschlange in Google Cloud Search hinzugefügt und nacheinander für die Indexierung abgerufen. In Google Cloud Search werden Warteschlangen verwaltet und Inhalte verglichen, um den Status der Elemente zu ermitteln, beispielsweise, ob eines aus dem Repository gelöscht wurde. Hier finden Sie weitere Informationen zur Indexierungswarteschlange in Google Cloud Search.
Während der Indexierung wird der Artikelinhalt aus dem Datenrepository abgerufen und alle untergeordneten Element-IDs werden in die Warteschlange verschoben. Der Connector fährt mit der rekursiven Verarbeitung übergeordneter und untergeordneter IDs fort, bis alle Elemente verarbeitet wurden.
Dieser Abschnitt bezieht sich auf Code-Snippets aus dem Beispiel GraphTraversalSample.
Einstiegspunkt des Connectors implementieren
Der Einstiegspunkt für einen Connector ist die Methode main()
. Sie dient hauptsächlich dazu, eine Instanz der Klasse Application
zu erstellen und die Methode start()
aufzurufen, um den Connector auszuführen.
Verwenden Sie die Klasse IndexingApplication.Builder
, um die Vorlage ListingConnector
zu instanziieren, bevor Sie application.start()
aufrufen. Für ListingConnector
wird ein Repository
-Objekt akzeptiert, dessen Methoden Sie implementieren.
Das folgende Snippet zeigt, wie die Klasse ListingConnector
und das dazugehörige Repository
instanziiert werden:
Im Hintergrund ruft das SDK die Methode initConfig()
auf, nachdem die Methode main()
Ihres Connectors Application.build
aufgerufen hat.
Die Methode initConfig()
:
- Die Methode
Configuation.isInitialized()
wird aufgerufen, um zu prüfen, obConfiguration
noch nicht initialisiert wurde. - Ein
Configuration
-Objekt wird mithilfe der von Google bereitgestellten Schlüssel/Wert-Paare initialisiert. Jedes dieser Paare wird in einemConfigValue
-Objekt innerhalb desConfiguration
-Objekts gespeichert.
Repository
-Schnittstelle implementieren
Die einzige Aufgabe des Repository
-Objekts besteht darin, Repository-Elemente zu durchsuchen und zu indexieren. Wenn Sie eine Vorlage verwenden, müssen Sie nur bestimmte Methoden in der Schnittstelle Repository
überschreiben, um einen Inhaltsconnector zu erstellen. Welche das sind, hängt von der verwendeten Vorlage und der Durchlaufstrategie ab. Für ListingConnector
überschreiben Sie die folgenden Methoden:
Die Methode
init()
. Wenn Sie ein Daten-Repository einrichten und initialisieren möchten, überschreiben Sie die Methodeinit()
.Die Methode
getIds()
. Wenn Sie IDs und Hashwerte für alle Datensätze im Repository abrufen möchten, überschreiben Sie die MethodegetIds()
.Die Methode
getDoc()
. Wenn Sie im Index Elemente hinzufügen, bearbeiten oder löschen möchten, überschreiben Sie die MethodegetDoc()
.Optional: Die Methode
getChanges()
. Wenn Ihr Repository die Änderungserkennung unterstützt, überschreiben Sie die MethodegetChanges()
. Sie wird für jeden geplanten inkrementellen Durchlauf (wie in Ihrer Konfiguration definiert) einmal aufgerufen, um die geänderten Elemente abzurufen und zu indexieren.Optional: Die Methode
close()
. Wenn Sie eine Repository-Bereinigung ausführen müssen, überschreiben Sie die Methodeclose()
. Sie wird einmal beim Herunterfahren des Connectors aufgerufen.
Für jede der Methoden des Repository
-Objekts wird ein Objekt des Typs ApiOperation
zurückgegeben. Ein ApiOperation
-Objekt führt eine Aktion in Form eines einzelnen oder möglicherweise mehrerer Aufrufe der Methode IndexingService.indexItem()
aus, um die tatsächliche Indexierung Ihres Repositorys zu veranlassen.
Benutzerdefinierte Konfigurationsparameter abrufen
Im Rahmen der Konfiguration der Konnektivität des Connectors müssen Sie alle benutzerdefinierten Parameter aus dem Configuration
-Objekt abrufen. Diese Aufgabe wird normalerweise in der Methode init()
der Klasse Repository
ausgeführt.
Die Klasse Configuration
bietet unterschiedliche Methoden, unterschiedliche Datentypen aus einer Konfiguration abzurufen. Bei jeder Methode wird ein ConfigValue
-Objekt zurückgegeben. Anschließend verwenden Sie die Methode get()
des ConfigValue
-Objekts, um den tatsächlichen Wert abzurufen.
Das folgende Snippet aus FullTraversalSample
zeigt, wie eine einzelne benutzerdefinierte Ganzzahl aus einem Configuration
-Objekt abgerufen wird:
Verwenden Sie zum Abrufen und Parsen eines Parameters mit mehreren Werten einen der Typen-Parser der Configuration
-Klasse, um die Daten in separate Segmente zu parsen.
Das folgende Snippet aus dem Connectorbeispiel des Tutorials zeigt, wie Sie mithilfe der Methode getMultiValue
eine Liste mit Namen von GitHub-Repositories erhalten:
Diagrammdurchlauf (Graph Traversal) durchführen
Überschreiben Sie die Methode getIds()
, um IDs und Hashwerte für alle Datensätze im Repository abzurufen.
An die Methode getIds()
kann ein Prüfpunkt übergeben werden. Dieser ermöglicht es, die Indexierung bei einem bestimmten Element fortzusetzen, sollte der Prozess unterbrochen werden.
Als Nächstes überschreiben Sie die Methode getDoc()
, um jedes Element in der Cloud Search-Indexierungswarteschlange zu verarbeiten.
Element-IDs und Hashwerte per Push übertragen
Überschreiben Sie getIds()
, um die Element-IDs und die zugehörigen Inhalts-Hashwerte aus dem Repository abzurufen. ID- und Hashwert-Paare werden dann in eine Push-Anforderung an die Cloud Search-Indexierungswarteschlange gepackt. Stamm- oder übergeordnete IDs werden normalerweise zuerst übertragen, gefolgt von untergeordneten IDs, bis die gesamte Hierarchie der Elemente verarbeitet wurde.
An die Methode getIds()
kann ein Prüfpunkt übergeben werden, der das letzte zu indexierende Element darstellt. Dieser ermöglicht es, die Indexierung bei einem bestimmten Element fortzusetzen, sollte der Prozess unterbrochen werden. Führen Sie für jedes Element in Ihrem Repository die folgenden Schritte in der Methode getIds()
aus:
- Rufen Sie jede Element-ID und den zugehörigen Hashwert aus dem Repository ab.
- Verpacken Sie jedes ID-Hashwert-Paar in eine
PushItems
-Klasse. - Kombinieren Sie alle
PushItems
in einem Iterator, der von der MethodegetIds()
zurückgegeben wird. Beachten Sie, dassgetIds()
tatsächlich einenCheckpointCloseableIterable
zurückgibt, eine Iteration des ObjektsApiOperation
. Jedes Objekt steht für eine API-Anfrage an einemRepositoryDoc
, z. B. Verschieben der Elemente in die Warteschlange.
Im folgenden Code-Snippet sehen Sie, wie IDs und Hashwerte abgerufen und in eine PushItems
-Klasse eingefügt werden. PushItems
ist eine ApiOperation
-Anfrage, mit der ein Element in die Cloud Search-Indexierungswarteschlange aufgenommen wird.
Im folgenden Code-Snippet sehen Sie, wie Sie die Klasse PushItems.Builder
verwenden, um die IDs und Hashwerte in eine einzige Push-ApiOperation
zu verpacken.
Die Elemente werden zur weiteren Verarbeitung an die Cloud Search-Indexierungswarteschlange gesendet.
Jedes Element abrufen und verarbeiten
Überschreiben Sie die Methode getDoc()
, um jedes Element in der Indexierungswarteschlange von Cloud Search zu verarbeiten.
Ein Element kann neu, geändert, unverändert oder nicht mehr im Quell-Repository vorhanden sein. Jedes neu abgerufene oder geänderte Element abrufen und indexieren Entfernen Sie Elemente aus dem Index, die nicht mehr im Quell-Repository vorhanden sind.
Die Methode getDoc()
akzeptiert ein Element aus der Cloud Search-Indexierungswarteschlange. Führen Sie für jedes Element in der Warteschlange die folgenden Schritte in der Methode getDoc()
aus:
Prüfen Sie, ob im Repository die ID des Elements aus der Cloud Search-Indexierungswarteschlange vorhanden ist. Ist dies nicht der Fall, löschen Sie das Element aus dem Index. Wenn das Element vorhanden ist, fahren Sie mit dem nächsten Schritt fort.
Geänderter Index oder neue Elemente:
- Legen Sie die Berechtigungen fest.
- Legen Sie die Metadaten für das zu indexierende Element fest.
- Kombinieren Sie die Metadaten und das Element in einer indexierbaren
RepositoryDoc
-Klasse. - Fügen Sie die untergeordneten IDs zur weiteren Verarbeitung der Cloud Search-Indexierungswarteschlange hinzu.
- Geben Sie
RepositoryDoc
zurück.
Umgang mit gelöschten Elementen
Im folgenden Code-Snippet sehen Sie, wie ermittelt werden kann, ob sich ein Element im Index befindet, und es nicht löscht.
Berechtigungen für ein Element festlegen
Ihr Repository verwendet eine Zugriffssteuerungsliste (Access Control List, ACL), um die Nutzer oder Gruppen zu identifizieren, die Zugriff auf ein Element haben. Eine ACL besteht aus einer Liste mit den IDs der Gruppen oder Nutzer, die Zugriff auf das Element haben.
Sie müssen die von Ihrem Repository verwendete ACL duplizieren. So sorgen Sie dafür, dass nur Nutzer, die Zugriff auf ein Element haben, es auch in den Suchergebnissen sehen können. Die ACL für ein Element muss beim Indexieren angegeben werden, damit Google Cloud Search über die erforderlichen Informationen verfügt, um die korrekten Zugriffsberechtigungen für das Element bereitzustellen.
Im Content Connector SDK sind viele ACL-Klassen und ‐Methoden enthalten, mit denen sich die ACLs der meisten Repositories modellieren lassen. Dazu müssen Sie die ACL für jedes Element in Ihrem Repository analysieren und eine entsprechende ACL für Google Cloud Search erstellen. Wenn die ACL Ihres Repositorys Konzepte wie die ACL-Vererbung verwendet, kann die Modellierung dieser ACL knifflig sein. Weitere Informationen zu ACLs von Google Cloud Search finden Sie im Leitfaden ACLs zuordnen.
Hinweis:Die Cloud Search Indexing API unterstützt ACLs für einzelne Domains. Domainübergreifende ACLs werden nicht unterstützt. Verwenden Sie die Klasse Acl.Builder
, um den Zugriff auf die einzelnen Elemente über eine ACL festzulegen. Mit dem folgenden Code-Snippet, das einem Beispiel für einen vollständigen Durchlauf entspricht, können alle Nutzer oder „Hauptkonten“ (getCustomerPrincipal()
) zu Lesegeräten aller Elemente (.setReaders()
) werden, wenn sie eine Suche ausführen.
Mit ACLs können Sie ACLs für das Repository korrekt modellieren. Es ist möglich, dass Sie Dateien in einem Dateisystem indexieren, das eine Art Vererbungsmodell verwendet, bei dem untergeordnete Ordner Berechtigungen von übergeordneten Ordnern erben. Für die Modellierung der ACL-Vererbung sind zusätzliche Informationen erforderlich, die in den ACLs von Google Cloud Search behandelt werden.
Metadaten für ein Element festlegen
Metadaten werden in einem Item
-Objekt gespeichert. Um ein Item
-Objekt zu erstellen, benötigen Sie mindestens die folgenden Angaben: die eindeutige String-ID, den Elementtyp, die ACL, die URL und die Elementversion.
Das folgende Code-Snippet zeigt, wie ein Item
-Objekt mithilfe der Helper-Klasse IndexingItemBuilder
erstellt wird.
Indexierbares Element erstellen
Nachdem Sie die Metadaten für das Element festgelegt haben, können Sie mithilfe der Klasse RepositoryDoc.Builder
das tatsächliche indexierbare Element erstellen.
Das folgende Beispiel zeigt, wie Sie ein einzelnes indexierbares Element erstellen.
RepositoryDoc
ist eine ApiOperation
, die die eigentliche IndexingService.indexItem()
-Anfrage ausführt.
Sie können auch die Methode setRequestMode()
der Klasse RepositoryDoc.Builder
verwenden, um die Indexierungsanforderung als ASYNCHRONOUS
oder SYNCHRONOUS
zu identifizieren:
ASYNCHRONOUS
- Im asynchronen Modus ist die Latenz zwischen Indexierung und Ausgabe höher, dafür kann er größere Mengen an Indexierungsanfragen verarbeiten. Der asynchrone Modus empfiehlt sich für die anfängliche Indexierung (Backfill) des gesamten Repositorys.
SYNCHRONOUS
- Im synchronen Modus ist die Latenz zwischen Indexierung und Ausgabe geringer, er eignet sich aber nur für begrenzte Durchsätze. Der synchrone Modus wird für die Indexierung von Updates und Änderungen am Repository empfohlen. Wenn keine Angabe erfolgt, wird standardmäßig der Modus
SYNCHRONOUS
verwendet.
Untergeordnete IDs in der Cloud Search-Indexierungswarteschlange platzieren
Im folgenden Code-Snippet wird gezeigt, wie die untergeordneten IDs für das derzeit verarbeitete übergeordnete Element in die Warteschlange der Verarbeitung aufgenommen werden. Diese IDs werden verarbeitet, nachdem das übergeordnete Element indexiert wurde.
Nächste Schritte
Als Nächstes könnten Sie Folgendes tun:
- Optional: Methode
close()
implementieren, damit vor dem Herunterfahren alle Ressourcen wieder freigegeben werden - Optional: Mit dem Identity Connector SDK einen Identitätsconnector erstellen
Mithilfe der REST API Inhaltsconnectors erstellen
In den folgenden Abschnitten wird erläutert, wie Sie mit der REST API einen Inhaltsconnector erstellen.
Durchlaufstrategie festlegen
Die Hauptfunktion eines Inhaltsconnectors besteht darin, ein Repository zu durchsuchen und die zugehörigen Daten zu indexieren. Sie müssen eine Durchlaufstrategie implementieren, die auf der Größe und dem Layout der Daten in Ihrem Repository basiert. Es gibt drei gängige Durchlaufstrategien:
- Durchlauf mit vollständiger Indexierung (Full Traversal)
Bei einer Strategie für das Durchlauf mit vollständiger Indexierung wird das gesamte Repository gescannt und blindlings jedes Element indexiert. Diese Strategie wird häufig verwendet, wenn Sie ein kleines Repository haben und sich bei jedem Indexieren den Aufwand für einen vollständigen Durchlauf leisten können.
Diese Durchlaufstrategie eignet sich für kleine Repositories, die hauptsächlich statische, nicht hierarchische Daten enthalten. Diese Durchlaufstrategie eignet sich auch, wenn die Änderungserkennung schwierig ist oder vom Repository nicht unterstützt wird.
- Durchlauf mit Teilindexierung (List Traversal)
Bei einer List Traversal-Strategie wird das gesamte Repository, einschließlich aller untergeordneten Knoten, gescannt, um den Status der einzelnen Elemente zu bestimmen. Dann nimmt der Connector eine zweite Karte bzw. ein zweites Ticket auf und indexiert nur Elemente, die neu oder seit der letzten Indexierung aktualisiert wurden. Diese Strategie wird in der Regel verwendet, um inkrementelle Aktualisierungen für einen vorhandenen Index durchzuführen. Es muss also nicht jedes Mal ein Durchlauf mit vollständiger Indexierung durchgeführt werden, wenn Sie den Index aktualisieren.
Diese Durchlaufstrategie eignet sich, wenn die Änderungserkennung schwierig ist oder vom Repository nicht unterstützt wird, Sie nicht hierarchische Daten haben und mit sehr großen Datensätzen arbeiten.
- Graph Traversal
Bei einer Graph Traversal-Strategie wird der gesamte übergeordnete Knoten gescannt, um den Status der einzelnen Elemente zu bestimmen. Anschließend nimmt der Connector eine zweite Karte bzw. ein zweites Ergebnis auf und indexiert nur Elemente im Stammknoten, die neu sind oder seit der letzten Indexierung aktualisiert wurden. Schließlich übergibt der Connector alle untergeordneten IDs und indexiert die Elemente in den untergeordneten Knoten, die neu sind oder aktualisiert wurden. Der Connector geht rekursiv durch alle untergeordneten Knoten, bis alle Elemente angesprochen wurden. Ein derartiger Durchlauf wird normalerweise für hierarchische Repositories verwendet, bei denen das Auflisten aller IDs nicht praktikabel ist.
Diese Strategie eignet sich, wenn Sie hierarchische Daten haben, die gecrawlt werden müssen, z. B. Serienverzeichnisse oder Webseiten.
Durchlaufstrategie und Indexelemente implementieren
Jedes indexierbare Element für Cloud Search wird in der Cloud Search API als Element bezeichnet. Ein Element kann eine Datei, ein Ordner, eine Zeile in einer CSV-Datei oder ein Datenbankeintrag sein.
Sobald Ihr Schema registriert ist, können Sie den Index so befüllen:
Optional: Verwenden Sie
items.upload
, um Dateien mit mehr als 100 KiB für die Indexierung hochzuladen. Bei kleineren Dateien betten Sie die Inhalte als inlineContent mithilfe vonitems.index
ein.Optional: Verwenden Sie
media.upload
, um Mediendateien für die Indexierung hochzuladen.Verwenden Sie
items.index
zum Indexieren des Elements. Wenn für Ihr Schema beispielsweise die Objektdefinition aus dem Filmschema verwendet wurde, würde eine Indexierungsanforderung für ein einzelnes Element folgendermaßen aussehen:{ "name": "datasource/<data_source_id>/items/titanic", "acl": { "readers": [ { "gsuitePrincipal": { "gsuiteDomain": true } } ] }, "metadata": { "title": "Titanic", "viewUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1", "objectType": "movie" }, "structuredData": { "object": { "properties": [ { "name": "movieTitle", "textValues": { "values": [ "Titanic" ] } }, { "name": "releaseDate", "dateValues": { "values": [ { "year": 1997, "month": 12, "day": 19 } ] } }, { "name": "actorName", "textValues": { "values": [ "Leonardo DiCaprio", "Kate Winslet", "Billy Zane" ] } }, { "name": "genre", "enumValues": { "values": [ "Drama", "Action" ] } }, { "name": "userRating", "integerValues": { "values": [ 8 ] } }, { "name": "mpaaRating", "textValues": { "values": [ "PG-13" ] } }, { "name": "duration", "textValues": { "values": [ "3 h 14 min" ] } } ] } }, "content": { "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.", "contentFormat": "TEXT" }, "version": "01", "itemType": "CONTENT_ITEM" }
Optional: Mit items.get-Aufrufen können Sie prüfen, ob ein Element indexiert wurde.
Um das gesamte Repository regelmäßig neu zu indexieren, führen Sie einen Full Traversal durch. Für einen List Traversal oder Graph Traversal müssen Sie Code für den Umgang mit Repository-Änderungen implementieren.
Umgang mit Repository-Änderungen
Sie können jedes Element aus einem Repository regelmäßig erfassen und indexieren, um eine vollständige Indexierung zu ermöglichen. Eine vollständige Indexierung kann zwar effektiv sein, aber immer aktuell sein, kann aber bei größeren oder hierarchischen Repositories kostspielig sein.
Anstatt ein gesamtes Repository regelmäßig mit Indexaufrufen zu indexieren, können Sie auch die Cloud Search-Indexierungswarteschlange verwenden, um Änderungen nachzuverfolgen und nur geänderte Elemente zu indexieren. Mithilfe von items.push-Anfragen lassen sich der Warteschlange für spätere Abfragen und Updates Elemente hinzufügen. Weitere Informationen zur Indexierungswarteschlange in Google Cloud finden Sie in diesem Artikel.
Weitere Informationen zur Google Cloud Search API finden Sie in diesem Artikel.