Ein Inhaltsconnector ist ein Programm, mit dem die Daten im Repository eines Unternehmens durchsucht werden, um eine Datenquelle zu befüllen. Google bietet Ihnen folgende Möglichkeiten, Inhaltsconnectors zu entwickeln:
Das Content Connector SDK. Diese Option eignet sich gut für Java-Programmierer. Das 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 unter Mit dem Content Connector SDK Inhaltsconnectors erstellen.
Eine Low-Level-REST API oder API-Bibliotheken: Verwenden Sie diese Optionen, wenn Sie nicht Java verwenden oder wenn Ihre Codebasis besser für eine REST API oder eine Bibliothek geeignet ist. Weitere Informationen zum Erstellen eines Inhaltsconnectors mit der REST API finden Sie im Abschnitt Mithilfe der REST API Inhaltsconnectors erstellen.
Mit einem typischen Inhaltsconnector werden die folgenden Aufgaben ausgeführt:
- Konfigurationsparameter lesen und verarbeiten
- Diskrete Teile indexierbarer Daten, sogenannte Elemente, aus dem Repository eines Drittanbieters abrufen
- Aus ACLs, Metadaten und Inhaltsdaten indexierbare Elemente erstellen
- Elemente indexieren und in die Cloud Search-Datenquelle aufnehmen
- Optional: Benachrichtigungen über Änderungen aus dem Repository erkennen. Änderungsbenachrichtigungen werden in Indexierungsanforderungen umgewandelt, um die Cloud Search-Datenquelle synchron zu halten. 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
Fügen Sie diese Abhängigkeiten in Ihre Build-Datei ein.
Maven
xml
<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-indexing-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>
Gradle
groovy
compile group: 'com.google.enterprise.cloudsearch',
name: 'google-cloudsearch-indexing-connector-sdk',
version: 'v1-0.0.3'
Connectorkonfiguration erstellen
Jeder Connector verwendet eine Konfigurationsdatei für Parameter wie Ihre Repository-ID.
Definieren Sie Parameter als Schlüssel/Wert-Paare, z. B. api.sourceId=1234567890abcdef.
Das Google Cloud Search SDK enthält von Google bereitgestellte Parameter für alle Connectors. Sie müssen Folgendes in Ihrer Konfigurationsdatei deklarieren:
- Inhaltsconnector: Deklarieren Sie
api.sourceIdundapi.serviceAccountPrivateKeyFile. Diese identifizieren Ihr Repository und den für den Zugriff erforderlichen privaten Schlüssel.
- Identitätsconnector: Deklarieren Sie
api.identitySourceId, um Ihre externe Identitätsquelle zu identifizieren. Für die Nutzersynchronisierung müssen Sie auchapi.customerId(die eindeutige ID für Ihr Google Workspace-Konto) deklarieren.
Andere von Google bereitgestellte Parameter müssen nur deklariert werden, wenn Sie ihre Standardwerte überschreiben möchten. Weitere Informationen zum Generieren von IDs und Schlüsseln finden Sie unter Von Google bereitgestellte Parameter.
Sie können auch Repository-spezifische Parameter in Ihrer Konfigurationsdatei definieren.
Konfigurationsdatei an den Connector übergeben
Legen Sie das Systemattribut config fest, um die Konfigurationsdatei zu übergeben. Verwenden Sie beim Starten des Connectors das Argument -D. Beispiel:
java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector
Wenn Sie dieses Argument weglassen, versucht das SDK, eine Datei mit dem Namen connector-config.properties im lokalen Verzeichnis zu verwenden.
Durchlaufstrategie festlegen
Die Hauptfunktion eines Inhaltsconnectors besteht darin, ein Repository zu durchsuchen und seine Daten zu indexieren. Sie müssen eine Strategie implementieren, die auf die Größe und das Layout Ihres Repository abgestimmt ist. Sie können Ihre eigene entwerfen oder eine Strategie aus dem SDK auswählen:
- Durchlauf mit vollständiger Indexierung (Full Traversal)
- Das gesamte Repository wird gescannt und jedes Element wird indexiert. Diese Strategie eignet sich am besten für kleine Repositories, bei denen ein vollständiger Durchlauf bei jeder Indexierung kein Problem darstellt. Verwenden Sie sie für kleine Repositories mit hauptsächlich statischen, nicht hierarchischen Daten oder wenn die Änderungserkennung schwierig ist.
- Durchlauf mit Teilindexierung (List Traversal)
- – Das gesamte Repository wird gescannt, um den Status der einzelnen Elemente zu ermitteln. Anschließend werden nur neue oder aktualisierte Elemente indexiert. Verwenden Sie diese Option für inkrementelle Aktualisierungen eines großen, nicht hierarchischen Index, wenn die Änderungserkennung nicht unterstützt wird.
- Knotenbasierter Durchlauf mit Teilindexierung (Graph Traversal)
- Scannt einen übergeordneten Knoten, um den Status seiner Elemente zu ermitteln, und indexiert dann neue oder aktualisierte Elemente in diesem Knoten. Anschließend werden untergeordnete Knoten rekursiv verarbeitet. Verwenden Sie diese Option für hierarchische Repositories, bei denen das Auflisten aller IDs nicht praktikabel ist, z. B. Verzeichnisstrukturen oder Websites.
Das SDK implementiert diese Strategien in Vorlagenklassen für Connectors. Diese Vorlagen können die Entwicklung beschleunigen. Informationen zur Verwendung einer Vorlage finden Sie im entsprechenden Abschnitt:
- Full Traversal-Connector mithilfe einer Vorlagenklasse erstellen
- List Traversal-Connector mithilfe einer Vorlagenklasse erstellen
- Graph Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Full Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Dieser Abschnitt bezieht sich auf Code aus dem Beispiel FullTraversalSample.
Einstiegspunkt des Connectors implementieren
Der Einstiegspunkt ist die Methode main(). Dabei wird eine Application-Instanz erstellt und start() aufgerufen, um den Connector auszuführen.
Verwenden Sie die Klasse IndexingApplication.Builder, um die Vorlage FullTraversalConnector zu instanziieren, bevor Sie application.start() aufrufen. Diese Vorlage akzeptiert ein Repository -Objekt.
Das SDK ruft initConfig() auf, nachdem Application.build() von der Methode main() aufgerufen wurde. Die Methode initConfig():
- Damit wird sichergestellt, dass
Configurationnoch nicht initialisiert wurde. - Initialisiert das
Configuration-Objekt mit den von Google bereitgestellten Schlüssel/Wert-Paaren.
Repository-Schnittstelle implementieren
Das Repository-Objekt durchsucht und indexiert Repository-Elemente. Wenn Sie eine Vorlage verwenden, müssen Sie nur bestimmte Methoden in der Repository-Schnittstelle überschreiben. Überschreiben Sie für FullTraversalConnector:
init(): Für die Einrichtung und Initialisierung des Repositorys.getAllDocs(): Zum Durchlaufen und Indexieren aller Elemente. Sie wird für jeden geplanten Durchlauf einmal aufgerufen.- (Optional)
getChanges(): Wenn Ihr Repository die Änderungserkennung unterstützt, überschreiben Sie diese Methode, um geänderte Elemente abzurufen und zu indexieren. - Optional:
close(): Zum Bereinigen des Repositorys beim Herunterfahren.
Bei jeder Methode wird ein ApiOperation-Objekt zurückgegeben, das die Indexierung mit IndexingService.indexItem() ausführt.
Benutzerdefinierte Konfigurationsparameter abrufen
Im Rahmen der Konfiguration der Konnektivität des Connectors müssen Sie alle benutzerdefinierten Parameter aus dem Configuration-Objekt abrufen. Führen Sie diese Aufgabe in der Methode init() der Klasse Repository aus.
Die Klasse Configuration enthält Methoden zum Abrufen verschiedener Datentypen.
Bei jeder Methode wird ein ConfigValue-Objekt zurückgegeben. Verwenden Sie die Methode get() des ConfigValue-Objekts, um den Wert abzurufen. In diesem Snippet aus FullTraversalSample sehen Sie, wie ein benutzerdefinierter Ganzzahlwert abgerufen wird:
Wenn Sie Parameter mit mehreren Werten abrufen und parsen möchten, verwenden Sie einen der Typ-Parser der Klasse Configuration. In diesem Snippet aus dem Connectorbeispiel des Tutorials wird getMultiValue verwendet, um eine Liste mit Namen von GitHub-Repositories abzurufen:
Vollständigen Durchlauf durchführen
Überschreiben Sie getAllDocs(), um einen vollständigen Durchlauf (Full Traversal) durchzuführen. Diese Methode akzeptiert einen Prüfpunkt, um die Indexierung fortzusetzen, wenn sie unterbrochen wurde. Für jedes Element:
- Legen Sie die Berechtigungen fest.
- Metadaten festlegen
- Kombinieren Sie sie zu einem
RepositoryDoc. - Packen Sie jedes Element in den Iterator, der von
getAllDocs()zurückgegeben wird.
Wenn die Menge der Elemente zu groß für einen Aufruf ist, verwenden Sie einen Checkpoint und rufen Sie hasMore(true) auf.
Berechtigungen für ein Element festlegen
In Repositories werden Zugriffssteuerungslisten (Access Control Lists, ACLs) verwendet, um Nutzer oder Gruppen mit Zugriff auf ein Element zu identifizieren. In einer ACL werden die IDs der autorisierten Nutzer oder Gruppen aufgeführt.
Damit Nutzer nur Suchergebnisse sehen, auf die sie Zugriff haben, müssen Sie die ACLs Ihres Repositorys replizieren. Geben Sie die ACL beim Indexieren eines Elements an, damit Google Cloud Search die richtige Zugriffsebene bereitstellen kann.
Das Content Connector SDK enthält Klassen und Methoden zum Modellieren der ACLs der meisten Repositories. Analysieren Sie die ACLs Ihres Repositorys und erstellen Sie während der Indexierung entsprechende ACLs für Cloud Search. Das Modellieren komplexer ACLs, z. B. solcher, die die Übernahme verwenden, erfordert eine sorgfältige Planung. Weitere Informationen finden Sie unter ACLs von Google Cloud Search.
Verwenden Sie die Klasse Acl.Builder, um den Zugriff festzulegen. Mit diesem Snippet aus dem Beispiel für die vollständige Traversierung können alle Domainnutzer (getCustomerPrincipal()) alle Elemente (setReaders()) lesen:
Für die richtige Modellierung von Repository-ACLs, insbesondere von ACLs mit Vererbungsmodellen, sind die Informationen unter Cloud Search-ACLs erforderlich.
Metadaten für ein Element festlegen
Metadaten werden in einem Item-Objekt gespeichert. Um ein Item-Objekt zu erstellen, benötigen Sie eine eindeutige ID, einen Elementtyp, eine ACL, eine URL und eine Version. Verwenden Sie die Hilfsklasse IndexingItemBuilder.
Indexierbares Element erstellen
Verwenden Sie die Klasse RepositoryDoc.Builder.
Ein RepositoryDoc ist ein ApiOperation, das die IndexingService.indexItem()-Anfrage ausführt.
Verwenden Sie die Methode setRequestMode() der Klasse RepositoryDoc.Builder, um die Indexierungsanforderung auf ASYNCHRONOUS oder SYNCHRONOUS festzulegen:
ASYNCHRONOUS- In diesem Modus ist die Latenz zwischen Indexierung und Ausgabe höher, dafür kann er größere Mengen an Indexierungsanfragen verarbeiten. Verwenden Sie den asynchronen Modus für die anfängliche Indexierung (Backfill) eines gesamten Repositorys.
SYNCHRONOUS- In diesem Modus ist die Latenz zwischen Indexierung und Bereitstellung geringer, aber das Durchsatzkontingent ist kleiner. Verwenden Sie den synchronen Modus für die Indexierung von Repository-Updates und ‑Änderungen. Wenn nichts festgelegt ist, wird standardmäßig der Modus
SYNCHRONOUSverwendet.
Jedes indexierbare Element in einen Iterator verpacken
Die Methode getAllDocs() gibt einen CheckpointCloseableIterable von RepositoryDoc-Objekten zurück. Verwenden Sie die Klasse CheckpointCloseableIterableImpl.Builder.
Nächste Schritte
- Optional: Wenn der Indexierungsdurchsatz langsam ist, finden Sie hier weitere Informationen dazu, wie Sie die Indexierungsrate erhöhen.
- Optional: Implementieren Sie
close(), um Ressourcen freizugeben. - Optional: Identitätsconnector erstellen
List Traversal-Connector mithilfe einer Vorlagenklasse erstellen
Die Cloud Search-Indexierungswarteschlange enthält IDs und optionale Hashes für Repository-Elemente. Mit einem List Traversal-Connector werden IDs in diese Warteschlange verschoben und für die Indexierung abgerufen. In Cloud Search werden diese Warteschlangen verwaltet, um den Status von Elementen zu ermitteln, z. B. ob sie gelöscht wurden. Weitere Informationen zur Indexierungswarteschlange in Google Cloud Search
Dieser Abschnitt bezieht sich auf das Beispiel ListTraversalSample.
Einstiegspunkt des Connectors implementieren
Mit der Methode main() wird eine Application-Instanz erstellt und start() aufgerufen. Verwenden Sie IndexingApplication.Builder, um die Vorlage ListingConnector zu instanziieren.
Repository-Schnittstelle implementieren
Überschreiben Sie die folgenden Methoden für ListingConnector:
init(): Für die Einrichtung des Repositorys.getIds(): Zum Abrufen von IDs und Hashes für alle Datensätze.getDoc(): Zum Hinzufügen, Aktualisieren oder Löschen von Elementen im Index.- (Optional)
getChanges(): Für inkrementelle Aktualisierungen mit Änderungserkennung. - (Optional)
close(): Für das Bereinigen des Repositorys.
Listendurchlauf (List Traversal) durchführen
Überschreiben Sie getIds(), um IDs und Hashes abzurufen. Überschreiben Sie getDoc(), um jedes Element in der Cloud Search-Indexierungswarteschlange zu verarbeiten.
Element-IDs und Hashwerte per Push übertragen
Überschreiben Sie getIds(), um IDs und Inhalts-Hashwerte abzurufen. Packen Sie sie in eine PushItems-Anfrage an die Indexierungswarteschlange.
Verwenden Sie PushItems.Builder, um die IDs und Hashes zu verpacken.
Alle Elemente abrufen und verarbeiten
Überschreiben Sie getDoc(), um Elemente in der Indexierungswarteschlange zu verarbeiten. Elemente können neu, geändert, unverändert oder gelöscht sein.
- Prüfen Sie, ob die Artikel-ID im Repository vorhanden ist. Andernfalls können Sie sie löschen.
- Fragen Sie den Index nach dem Status ab. Wenn er nicht geändert wurde (
ACCEPTED), tun Sie nichts weiter. - Geänderte oder neue Elemente indexieren: Berechtigungen festlegen, Metadaten festlegen, in einem
RepositoryDockombinieren und zurückgeben.
Umgang mit gelöschten Elementen
In diesem Snippet wird gezeigt, wie Sie feststellen, ob ein Element vorhanden ist, und es gegebenenfalls löschen.
Umgang mit unveränderten Elementen
Rufen Sie die Indexierungs-Warteschlange ab, um unveränderte Elemente zu verarbeiten.
Im Beispiel wird ein Hash verwendet, um Änderungen zu erkennen.
Berechtigungen für ein Element festlegen
In Repositories werden Zugriffssteuerungslisten (Access Control Lists, ACLs) verwendet, um Nutzer oder Gruppen mit Zugriff auf ein Element zu identifizieren. In einer ACL werden die IDs der autorisierten Nutzer oder Gruppen aufgeführt.
Damit Nutzer nur Suchergebnisse sehen, auf die sie Zugriff haben, müssen Sie die ACLs Ihres Repositorys replizieren. Geben Sie die ACL beim Indexieren eines Elements an, damit Google Cloud Search die richtige Zugriffsebene bereitstellen kann.
Das Content Connector SDK enthält Klassen und Methoden zum Modellieren der ACLs der meisten Repositories. Analysieren Sie die ACLs Ihres Repositorys und erstellen Sie während der Indexierung entsprechende ACLs für Cloud Search. Das Modellieren komplexer ACLs, z. B. solcher, die die Übernahme verwenden, erfordert eine sorgfältige Planung. Weitere Informationen finden Sie unter ACLs von Google Cloud Search.
Verwenden Sie die Klasse Acl.Builder, um den Zugriff festzulegen. Mit diesem Snippet aus dem Beispiel für die vollständige Traversierung können alle Domainnutzer (getCustomerPrincipal()) alle Elemente (setReaders()) lesen:
Für die richtige Modellierung von Repository-ACLs, insbesondere von ACLs mit Vererbungsmodellen, sind die Informationen unter Cloud Search-ACLs erforderlich.
Metadaten für ein Element festlegen
Indexierbares Element erstellen
Verwenden Sie die Methode setRequestMode() der Klasse RepositoryDoc.Builder, um die Indexierungsanforderung auf ASYNCHRONOUS oder SYNCHRONOUS festzulegen:
ASYNCHRONOUS- In diesem Modus ist die Latenz zwischen Indexierung und Ausgabe höher, dafür kann er größere Mengen an Indexierungsanfragen verarbeiten. Verwenden Sie den asynchronen Modus für die anfängliche Indexierung (Backfill) eines gesamten Repositorys.
SYNCHRONOUS- In diesem Modus ist die Latenz zwischen Indexierung und Bereitstellung geringer, aber das Durchsatzkontingent ist kleiner. Verwenden Sie den synchronen Modus für die Indexierung von Repository-Updates und ‑Änderungen. Wenn nichts festgelegt ist, wird standardmäßig der Modus
SYNCHRONOUSverwendet.
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 die Element-IDs in eine Cloud Search-Indexierungswarteschlange verschoben 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 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 verarbeitet rekursiv die übergeordneten und untergeordneten IDs, bis alle Elemente verarbeitet sind.
Einstiegspunkt des Connectors implementieren
Der Einstiegspunkt für einen Connector ist die Methode main(). Sie erstellt eine Instanz der Klasse Application und ruft die Methode start() auf, 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.
Repository-Schnittstelle implementieren
Überschreiben Sie init(), getIds(), getDoc() und optional getChanges() oder close().
Diagrammdurchlauf (Graph Traversal) durchführen
Überschreiben Sie getIds(), um die ursprünglichen IDs abzurufen, und getDoc(), um Elemente zu verarbeiten und untergeordnete IDs in die Warteschlange zu stellen.
Element-IDs und Hashwerte per Push übertragen
Alle Elemente abrufen und verarbeiten
- Prüfen Sie, ob die ID im Repository vorhanden ist. Wenn nicht, löschen Sie das Element.
- Legen Sie für vorhandene Elemente Berechtigungen und Metadaten fest und kombinieren Sie sie in einem
RepositoryDoc. - Untergeordnete IDs in die Indexierungswarteschlange einfügen
- Geben Sie
RepositoryDoczurück.
Umgang mit gelöschten Elementen
Metadaten festlegen und Element erstellen
Untergeordnete IDs in der Indexierungswarteschlange platzieren
Mithilfe der REST API Inhaltsconnectors erstellen
In den folgenden Abschnitten wird erläutert, wie Sie mithilfe der REST API einen Inhaltsconnector erstellen.
Durchlaufstrategie festlegen
Die Strategien (Full, List und Graph) sind konzeptionell dieselben wie für das SDK. Implementieren Sie die ausgewählte Strategie mit der REST API.
Durchlaufstrategie und Indexelemente implementieren
Registrieren Sie Ihr Schema und befüllen Sie dann den Index mit:
- Optional:
items.uploadfür Dateien mit mehr als 100 KiB. - Optional:
media.uploadfür Mediendateien. items.indexzum Indexieren des Elements.Beispielanfrage zur Indexierung:
{ "name": "datasource/<data_source_id>/items/titanic", "acl": { "readers": [ { "gsuitePrincipal": { "gsuiteDomain": true } } ] }, "metadata": { "title": "Titanic", "viewUrl": "http://www.imdb.com/title/tt2234155/", "objectType": "movie" }, "structuredData": { "object": { "properties": [ { "name": "movieTitle", "textValues": { "values": ["Titanic"] } } ] } }, "content": { "inlineContent": "A seventeen-year-old aristocrat falls in love...", "contentFormat": "TEXT" }, "version": "01", "itemType": "CONTENT_ITEM" }Optional: Verwenden Sie
items.get, um die Indexierung zu prüfen.
Umgang mit Repository-Änderungen
Indexieren Sie das gesamte Repository regelmäßig neu, um eine vollständige Indexierung zu erreichen. Verwenden Sie für List Traversal oder Graph Traversal die Cloud Search-Indexierungswarteschlange, um Änderungen nachzuverfolgen und nur geänderte Elemente zu indexieren. Verwende items.push, um Elemente zur Warteschlange hinzuzufügen.