Inhaltsconnector erstellen

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:

  1. Konfigurationsparameter lesen und verarbeiten
  2. Diskrete Teile indexierbarer Daten, sogenannte Elemente, aus dem Repository eines Drittanbieters abrufen
  3. Aus ACLs, Metadaten und Inhaltsdaten indexierbare Elemente erstellen
  4. Elemente indexieren und in die Cloud Search-Datenquelle aufnehmen
  5. 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.sourceId und api.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 auch api.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

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.

FullTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new FullTraversalConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

Das SDK ruft initConfig() auf, nachdem Application.build() von der Methode main() aufgerufen wurde. Die Methode initConfig():

  1. Damit wird sichergestellt, dass Configuration noch nicht initialisiert wurde.
  2. 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:

FullTraversalSample.java
@Override
public void init(RepositoryContext context) {
  log.info("Initializing repository");
  numberOfDocuments = Configuration.getInteger("sample.documentCount", 10).get();
}

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:

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

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:

  1. Legen Sie die Berechtigungen fest.
  2. Metadaten festlegen
  3. Kombinieren Sie sie zu einem RepositoryDoc.
  4. 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:

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

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.

FullTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with appropriate attributes
// (this can be expanded to include metadata fields etc.)
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(id))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();
Indexierbares Element erstellen

Verwenden Sie die Klasse RepositoryDoc.Builder.

FullTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", id);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

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 SYNCHRONOUS verwendet.
Jedes indexierbare Element in einen Iterator verpacken

Die Methode getAllDocs() gibt einen CheckpointCloseableIterable von RepositoryDoc-Objekten zurück. Verwenden Sie die Klasse CheckpointCloseableIterableImpl.Builder.

FullTraversalSample.java
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(allDocs).build();

Nächste Schritte

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.

ListTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a
 * list traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new ListingConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

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.

ListTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
for (Map.Entry<Integer, Long> entry : this.documents.entrySet()) {
  String documentId = Integer.toString(entry.getKey());
  String hash = this.calculateMetadataHash(entry.getKey());
  PushItem item = new PushItem().setMetadataHash(hash);
  log.info("Pushing " + documentId);
  allIds.addPushItem(documentId, item);
}

Verwenden Sie PushItems.Builder, um die IDs und Hashes zu verpacken.

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
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.

  1. Prüfen Sie, ob die Artikel-ID im Repository vorhanden ist. Andernfalls können Sie sie löschen.
  2. Fragen Sie den Index nach dem Status ab. Wenn er nicht geändert wurde (ACCEPTED), tun Sie nichts weiter.
  3. Geänderte oder neue Elemente indexieren: Berechtigungen festlegen, Metadaten festlegen, in einem RepositoryDoc kombinieren 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.

ListTraversalSample.java
String resourceName = item.getName();
int documentId = Integer.parseInt(resourceName);

if (!documents.containsKey(documentId)) {
  // Document no longer exists -- delete it
  log.info(() -> String.format("Deleting document %s", item.getName()));
  return ApiOperations.deleteItem(resourceName);
}
Umgang mit unveränderten Elementen

Rufen Sie die Indexierungs-Warteschlange ab, um unveränderte Elemente zu verarbeiten.

ListTraversalSample.java
String currentHash = this.calculateMetadataHash(documentId);
if (this.canSkipIndexing(item, currentHash)) {
  // Document neither modified nor deleted, ack the push
  log.info(() -> String.format("Document %s not modified", item.getName()));
  PushItem pushItem = new PushItem().setType("NOT_MODIFIED");
  return new PushItems.Builder().addPushItem(resourceName, pushItem).build();
}

Im Beispiel wird ein Hash verwendet, um Änderungen zu erkennen.

ListTraversalSample.java
/**
 * Checks to see if an item is already up to date
 *
 * @param previousItem Polled item
 * @param currentHash  Metadata hash of the current github object
 * @return PushItem operation
 */
private boolean canSkipIndexing(Item previousItem, String currentHash) {
  if (previousItem.getStatus() == null || previousItem.getMetadata() == null) {
    return false;
  }
  String status = previousItem.getStatus().getCode();
  String previousHash = previousItem.getMetadata().getHash();
  return "ACCEPTED".equals(status)
      && previousHash != null
      && previousHash.equals(currentHash);
}
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:

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

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
ListTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Set metadata hash so queue can detect changes
String metadataHash = this.calculateMetadataHash(documentId);

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(documentId))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .setHash(metadataHash)
    .build();
Indexierbares Element erstellen
ListTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

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 SYNCHRONOUS verwendet.

Nächste Schritte

Als Nächstes könnten Sie Folgendes tun:

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
GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
Alle Elemente abrufen und verarbeiten
  1. Prüfen Sie, ob die ID im Repository vorhanden ist. Wenn nicht, löschen Sie das Element.
  2. Legen Sie für vorhandene Elemente Berechtigungen und Metadaten fest und kombinieren Sie sie in einem RepositoryDoc.
  3. Untergeordnete IDs in die Indexierungswarteschlange einfügen
  4. Geben Sie RepositoryDoc zurück.
Umgang mit gelöschten Elementen
GraphTraversalSample.java
String resourceName = item.getName();
if (documentExists(resourceName)) {
  return buildDocumentAndChildren(resourceName);
}
// Document doesn't exist, delete it
log.info(() -> String.format("Deleting document %s", resourceName));
return ApiOperations.deleteItem(resourceName);
Metadaten festlegen und Element erstellen
GraphTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(documentId)
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();
GraphTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %s", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

RepositoryDoc.Builder docBuilder = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT);
Untergeordnete IDs in der Indexierungswarteschlange platzieren
GraphTraversalSample.java
// Queue the child nodes to visit after indexing this document
Set<String> childIds = getChildItemNames(documentId);
for (String id : childIds) {
  log.info(() -> String.format("Pushing child node %s", id));
  PushItem pushItem = new PushItem();
  docBuilder.addChildId(id, pushItem);
}

RepositoryDoc doc = docBuilder.build();

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:

  1. Optional: items.upload für Dateien mit mehr als 100 KiB.
  2. Optional: media.upload für Mediendateien.
  3. items.index zum 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"
    }
    
  4. 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.