Crea un connettore di contenuti

Un connettore di contenuti è un programma software che attraversa i dati in un repository aziendale e compila un'origine dati. Google offre le seguenti opzioni per lo sviluppo di connettori di contenuti:

Un tipico connettore di contenuti esegue le seguenti attività:

  1. Legge ed elabora i parametri di configurazione.
  2. Estrae blocchi discreti di dati indicizzabili, chiamati "elementi", dal repository di terze parti.
  3. Combina ACL, metadati e dati dei contenuti in elementi indicizzabili.
  4. Indicizza gli elementi nell'origine dati Cloud Search.
  5. (Facoltativo) Ascolta le notifiche di modifica dal repository. Le notifiche di modifica vengono convertite in richieste di indicizzazione per mantenere sincronizzata l'origine dati di Cloud Search. Il connettore esegue questa attività solo se il repository supporta il rilevamento delle modifiche.

Crea un connettore di contenuti utilizzando l'SDK Content Connector

Le sezioni seguenti spiegano come creare un connettore di contenuti utilizzando Content Connector SDK.

Configurare le dipendenze

Includi queste dipendenze nel file di build.

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'

Crea la configurazione del connettore

Ogni connettore utilizza un file di configurazione per parametri come l'ID repository. Definisci i parametri come coppie chiave-valore, ad esempio api.sourceId=1234567890abcdef.

Google Cloud Search SDK include parametri forniti da Google per tutti i connettori. Devi dichiarare quanto segue nel file di configurazione:

  • Connettore di contenuti: dichiara api.sourceId e api.serviceAccountPrivateKeyFile. Questi identificano il tuo repository e la chiave privata necessaria per l'accesso.
  • Connettore di identità: dichiara api.identitySourceId per identificare l'origine identità esterna. Per la sincronizzazione degli utenti, dichiara anche api.customerId (l'ID univoco del tuo account Google Workspace).

Dichiara altri parametri forniti da Google solo per eseguire l'override dei valori predefiniti. Per informazioni dettagliate sulla generazione di ID e chiavi, vedi Parametri forniti da Google.

Puoi anche definire parametri specifici per il repository nel file di configurazione.

Trasferisci il file di configurazione al connettore

Imposta la proprietà di sistema config per passare il file di configurazione. Utilizza l'argomento -D quando avvii il connettore. Ad esempio:

java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector

Se ometti questo argomento, l'SDK tenta di utilizzare un file denominato connector-config.properties nella directory locale.

Determinare la strategia di attraversamento

La funzione principale di un connettore di contenuti è attraversare un repository e indicizzare i relativi dati. Devi implementare una strategia in base alle dimensioni e al layout del repository. Puoi progettare la tua strategia o sceglierne una dall'SDK:

Strategia di attraversamento completo
Scansiona l'intero repository e indicizza ogni elemento. Questa strategia è ideale per repository di piccole dimensioni in cui puoi permetterti l'overhead di un attraversamento completo durante ogni indicizzazione. Utilizzalo per repository di piccole dimensioni con dati per lo più statici e non gerarchici oppure quando il rilevamento delle modifiche è difficile.
Strategia di attraversamento degli elenchi
Esegue la scansione dell'intero repository per determinare lo stato di ogni elemento, quindi indicizza solo gli elementi nuovi o aggiornati. Utilizzalo per gli aggiornamenti incrementali di un indice di grandi dimensioni e non gerarchico quando il rilevamento delle modifiche non è supportato.
Attraversamento del grafico
Esegue la scansione di un nodo principale per determinare lo stato dei relativi elementi, quindi indicizza gli elementi nuovi o aggiornati nel nodo. Quindi, elabora in modo ricorsivo i nodi secondari. Utilizza questo formato per i repository gerarchici in cui elencare tutti gli ID non è pratico, ad esempio strutture di directory o siti web.

L'SDK implementa queste strategie nelle classi dei connettori dei modelli. Questi modelli possono accelerare lo sviluppo. Per utilizzare un modello, consulta la sezione corrispondente:

Creare un connettore di attraversamento completo utilizzando una classe modello

Questa sezione fa riferimento al codice di FullTraversalSample.

Implementa il punto di ingresso del connettore

L'entry point è il metodo main(). Crea un'istanza di Application e chiama start() per eseguire il connettore.

Prima di chiamare application.start(), utilizza la classe IndexingApplication.Builder per creare un'istanza del modello FullTraversalConnector. Questo modello accetta un oggetto Repository.

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();
}

L'SDK chiama initConfig() dopo le chiamate al metodo main() Application.build(). Il metodo initConfig():

  1. Garantisce che Configuration non sia già inizializzato.
  2. Inizializza l'oggetto Configuration con le coppie chiave-valore fornite da Google.

Implementa l'interfaccia Repository

L'oggetto Repository attraversa e indicizza gli elementi del repository. Quando utilizzi un modello, devi sostituire solo determinati metodi nell'interfaccia Repository. Per FullTraversalConnector, sostituzione:

  • init(): Per la configurazione e l'inizializzazione del repository.
  • getAllDocs(): Per attraversare e indicizzare tutti gli elementi. Viene chiamato una volta per ogni attraversamento pianificato.
  • (Facoltativo) getChanges(): se il repository supporta il rilevamento delle modifiche, esegui l'override di questa impostazione per recuperare e indicizzare gli elementi modificati.
  • (Facoltativo) close(): Per la pulizia del repository durante l'arresto.

Ogni metodo restituisce un oggetto ApiOperation, che esegue l'indicizzazione utilizzando IndexingService.indexItem().

Ottenere parametri di configurazione personalizzati

Per gestire la configurazione del connettore, devi recuperare tutti i parametri personalizzati dall'oggetto Configuration. Esegui questa attività nel metodo Repository della classe init().

La classe Configuration include metodi per recuperare diversi tipi di dati. Ogni metodo restituisce un oggetto ConfigValue. Utilizza il metodo get() dell'oggetto ConfigValue per recuperare il valore. Questo snippet di FullTraversalSample mostra come recuperare un valore intero personalizzato:

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

Per recuperare e analizzare i parametri con più valori, utilizza uno dei parser di tipo della classe Configuration. Questo snippet del connettore del tutorial utilizza getMultiValue per recuperare un elenco di nomi di repository GitHub:

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

Eseguire un'attraversamento completo

Esegui l'override di getAllDocs() per eseguire un attraversamento completo. Questo metodo accetta un checkpoint per riprendere l'indicizzazione in caso di interruzione. Per ogni elemento:

  1. Imposta le autorizzazioni.
  2. Imposta i metadati.
  3. Combinali in un RepositoryDoc.
  4. Inserisci ogni elemento nel pacchetto dell'iteratore restituito da getAllDocs().

Se il set di elementi è troppo grande per una sola chiamata, utilizza un checkpoint e chiama hasMore(true).

Impostare le autorizzazioni per un elemento

I repository utilizzano gli elenchi di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi con accesso a un elemento. Una ACL elenca gli ID di utenti o gruppi autorizzati.

Per garantire che gli utenti vedano solo i risultati di ricerca a cui sono autorizzati ad accedere, devi replicare gli ACL del repository. Includi l'ACL durante l'indicizzazione di un elemento in modo che Google Cloud Search possa fornire il livello di accesso corretto.

L'SDK Content Connector include classi e metodi per modellare le ACL della maggior parte dei repository. Analizza gli elenchi di controllo degli accessi del repository e crea gli elenchi di controllo degli accessi corrispondenti per Cloud Search durante l'indicizzazione. La modellazione di ACL complesse, come quelle che utilizzano l'ereditarietà, richiede un'attenta pianificazione. Per saperne di più, consulta la pagina ACL di Cloud Search.

Utilizza la classe Acl.Builder per impostare l'accesso. Questo snippet dell'esempio di attraversamento completo consente a tutti gli utenti del dominio (getCustomerPrincipal()) di leggere tutti gli elementi (setReaders()):

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

La modellazione corretta degli ACL del repository, in particolare quelli che utilizzano modelli di ereditarietà, richiede le informazioni contenute in ACL di Cloud Search.

Impostare i metadati per un elemento

I metadati vengono archiviati in un oggetto Item. Per creare un Item, devi disporre di un ID, un tipo di elemento, un ACL, un URL e una versione unici. Utilizza la classe helper 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();
Crea l'elemento indicizzabile

Utilizza la classe 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();

Un RepositoryDoc è un ApiOperation che esegue la richiesta IndexingService.indexItem().

Utilizza il metodo setRequestMode() della classe RepositoryDoc.Builder per impostare la richiesta di indicizzazione su ASYNCHRONOUS o SYNCHRONOUS:

ASYNCHRONOUS
Questa modalità ha una latenza di indicizzazione e pubblicazione più lunga, ma offre una quota di throughput maggiore. Utilizza la modalità asincrona per l'indicizzazione iniziale (backfill) di un intero repository.
SYNCHRONOUS
Questa modalità ha una latenza di indicizzazione-erogazione più breve, ma una quota di throughput inferiore. Utilizza la modalità sincrona per indicizzare gli aggiornamenti e le modifiche del repository. Se non specificata, la modalità di richiesta è SYNCHRONOUS per impostazione predefinita.
Inserisci ogni elemento indicizzabile in un iteratore

Il metodo getAllDocs() restituisce un CheckpointCloseableIterable di oggetti RepositoryDoc. Utilizza la classe CheckpointCloseableIterableImpl.Builder.

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

Passaggi successivi

Crea un connettore di attraversamento di elenchi utilizzando una classe modello

La coda di indicizzazione di Cloud Search contiene ID e hash facoltativi per gli elementi del repository. Un connettore di attraversamento di elenchi inserisce gli ID in questa coda e li recupera per l'indicizzazione. Cloud Search gestisce queste code per determinare lo stato degli elementi, ad esempio le eliminazioni. Consulta La coda di indicizzazione di Cloud Search.

Questa sezione si riferisce a ListTraversalSample.

Implementa il punto di ingresso del connettore

Il metodo main() crea un'istanza Application e chiama start(). Utilizza IndexingApplication.Builder per creare un'istanza del modello ListingConnector.

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();
}

Implementa l'interfaccia Repository

Esegui l'override dei seguenti metodi per ListingConnector:

  • init(): Per la configurazione del repository.
  • getIds(): Per recuperare ID e hash per tutti i record.
  • getDoc(): Per aggiungere, aggiornare o eliminare elementi dall'indice.
  • (Facoltativo) getChanges(): per aggiornamenti incrementali utilizzando il rilevamento delle modifiche.
  • (Facoltativo) close(): per la pulizia del repository.

Eseguire l'attraversamento della lista

Esegui l'override di getIds() per recuperare ID e hash. Esegui l'override di getDoc() per gestire ogni elemento nella coda di indicizzazione di Cloud Search.

Invio di ID articolo e valori hash

Esegui l'override di getIds() per recuperare ID e hash dei contenuti. Raggruppali in una richiesta PushItems alla coda di indicizzazione.

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);
}

Utilizza PushItems.Builder per raggruppare gli ID e gli hash.

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
Recuperare e gestire ogni elemento

Esegui l'override di getDoc() per gestire gli elementi nella coda di indicizzazione. Gli elementi possono essere nuovi, modificati, invariati o eliminati.

  1. Controlla se l'ID articolo esiste nel repository. In caso contrario, eliminalo.
  2. Esegui il polling dell'indice per lo stato. Se non è stato modificato (ACCEPTED), non fare nulla.
  3. Elementi nuovi o modificati dell'indice: imposta le autorizzazioni, imposta i metadati, combinali in un RepositoryDoc e restituiscili.
Gestire gli elementi eliminati

Questo snippet mostra come determinare se un elemento esiste ed eliminarlo in caso contrario.

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);
}
Gestire gli elementi non modificati

Esegui il polling della coda di indicizzazione per gestire gli elementi invariati.

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();
}

L'esempio utilizza un hash per rilevare le modifiche.

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);
}
Impostare le autorizzazioni per un elemento

I repository utilizzano gli elenchi di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi con accesso a un elemento. Una ACL elenca gli ID di utenti o gruppi autorizzati.

Per garantire che gli utenti vedano solo i risultati di ricerca a cui sono autorizzati ad accedere, devi replicare gli ACL del repository. Includi l'ACL durante l'indicizzazione di un elemento in modo che Google Cloud Search possa fornire il livello di accesso corretto.

L'SDK Content Connector include classi e metodi per modellare le ACL della maggior parte dei repository. Analizza gli elenchi di controllo degli accessi del repository e crea gli elenchi di controllo degli accessi corrispondenti per Cloud Search durante l'indicizzazione. La modellazione di ACL complesse, come quelle che utilizzano l'ereditarietà, richiede un'attenta pianificazione. Per saperne di più, consulta la pagina ACL di Cloud Search.

Utilizza la classe Acl.Builder per impostare l'accesso. Questo snippet dell'esempio di attraversamento completo consente a tutti gli utenti del dominio (getCustomerPrincipal()) di leggere tutti gli elementi (setReaders()):

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

La modellazione corretta degli ACL del repository, in particolare quelli che utilizzano modelli di ereditarietà, richiede le informazioni contenute in ACL di Cloud Search.

Impostare i metadati per un elemento
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();
Creare un elemento indicizzabile
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();

Utilizza il metodo setRequestMode() della classe RepositoryDoc.Builder per impostare la richiesta di indicizzazione su ASYNCHRONOUS o SYNCHRONOUS:

ASYNCHRONOUS
Questa modalità ha una latenza di indicizzazione e pubblicazione più lunga, ma offre una quota di throughput maggiore. Utilizza la modalità asincrona per l'indicizzazione iniziale (backfill) di un intero repository.
SYNCHRONOUS
Questa modalità ha una latenza di indicizzazione-erogazione più breve, ma una quota di throughput inferiore. Utilizza la modalità sincrona per indicizzare gli aggiornamenti e le modifiche del repository. Se non specificata, la modalità di richiesta è SYNCHRONOUS per impostazione predefinita.

Passaggi successivi

Ecco alcuni passaggi successivi che puoi intraprendere:

Crea un connettore di attraversamento del grafico utilizzando una classe modello

La coda di indicizzazione di Cloud Search contiene ID e valori hash facoltativi per ogni elemento del repository. Un connettore di attraversamento del grafico inserisce gli ID elemento nella coda di indicizzazione di Google Cloud Search e li recupera uno alla volta per l'indicizzazione. Google Cloud Search gestisce le code e confronta i contenuti delle code per determinare lo stato degli elementi, ad esempio se un elemento è stato eliminato dal repository. Per saperne di più sulla coda di indicizzazione di Cloud Search, consulta La coda di indicizzazione di Google Cloud Search.

Durante l'indicizzazione, i contenuti dell'articolo vengono recuperati dal repository di dati e gli ID articolo secondari vengono inseriti nella coda. Il connettore elabora in modo ricorsivo gli ID principali e secondari finché non vengono gestiti tutti gli elementi.

Implementa il punto di ingresso del connettore

Il punto di ingresso di un connettore è il metodo main(). Questo metodo crea un'istanza della classe Application e chiama il relativo metodo start() per eseguire il connettore.

Prima di chiamare application.start(), utilizza la classe IndexingApplication.Builder per creare un'istanza del modello ListingConnector. ListingConnector accetta un oggetto Repository i cui metodi implementi.

Implementa l'interfaccia Repository

Esegui l'override di init(), getIds(), getDoc() e, facoltativamente, di getChanges() o close().

Esegui l'attraversamento del grafico

Esegui l'override di getIds() per recuperare gli ID iniziali e di getDoc() per gestire gli elementi e inserire gli ID secondari nella coda.

Invio di ID articolo e valori hash
GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
Recuperare e gestire ogni elemento
  1. Controlla se l'ID esiste nel repository. In caso contrario, elimina l'elemento.
  2. Per gli elementi esistenti, imposta le autorizzazioni e i metadati e combinali in un RepositoryDoc.
  3. Trasferisci gli ID secondari alla coda di indicizzazione.
  4. Restituisci RepositoryDoc.
Gestire gli elementi eliminati
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);
Imposta i metadati e crea l'elemento
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);
Inserisci gli ID secondari nella coda di indicizzazione
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();

Crea un connettore di contenuti utilizzando l'API REST

Le sezioni seguenti spiegano come creare un connettore di contenuti utilizzando l'API REST.

Determinare la strategia di attraversamento

Le strategie (completa, elenco e grafico) sono concettualmente le stesse dell'SDK. Implementa la strategia scelta utilizzando l'API REST.

Implementare la strategia di attraversamento e indicizzare gli elementi

Registra lo schema, quindi compila l'indice utilizzando:

  1. (Facoltativo) items.upload per i file più grandi di 100 KiB.
  2. (Facoltativo) media.upload per i file multimediali.
  3. items.index per indicizzare l'elemento.

    Esempio di richiesta di indicizzazione:

    {
      "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. (Facoltativo) Utilizza items.get per verificare l'indicizzazione.

Gestire le modifiche al repository

Esegui periodicamente la reindicizzazione dell'intero repository per l'indicizzazione completa. Per l'attraversamento di elenchi o grafici, utilizza la coda di indicizzazione di Google Cloud per monitorare le modifiche e indicizzare solo ciò che è cambiato. Usa items.push per aggiungere elementi alla coda.