Crea un connettore di contenuti

Un connettore di contenuti è un programma software utilizzato per trasferire i dati in un di archiviazione di Google Cloud e compilare un'origine dati. Google fornisce quanto segue opzioni per lo sviluppo di connettori di contenuti:

  • L'SDK Content Connector. È una buona opzione se stai programmando in Java. L'SDK Content Connector è un wrapper l'API REST, che consente di creare rapidamente connettori. Per creare un contenuto utilizzando l'SDK, consulta Crea un connettore di contenuti utilizzando l'SDK Content Connector.

  • Un'API REST o librerie API di basso livello. Utilizza queste opzioni in caso contrario programmazione in Java o se il tuo codebase supporta meglio tramite un'API REST o una libreria. Per creare un connettore di contenuti utilizzando l'API REST, consulta a Crea un connettore di contenuti utilizzando l'API REST.

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 "items" dalla terza parte repository di contenuti.
  3. Combina ACL, metadati e dati sui contenuti in elementi indicizzabili.
  4. Indicizza gli elementi nell'origine dati di Cloud Search.
  5. (Facoltativo) Ascolta le notifiche di modifica dei contenuti di terze parti repository Git. Le notifiche di modifica vengono convertite in richieste di indicizzazione per mantenere sincronizzare l'origine dati di Cloud Search con il repository di terze parti. La Il connettore esegue questa attività solo se il repository supporta il rilevamento delle modifiche.

Creare un connettore di contenuti utilizzando l'SDK Content Connector

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

Configura le dipendenze

Per utilizzare l'SDK, devi includere determinate dipendenze nel file di build. Clic in una scheda riportata di seguito per visualizzare le dipendenze per il tuo ambiente di build:

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'

Crea la configurazione del connettore

Ogni connettore dispone di un file di configurazione contenente i parametri utilizzati dal come l'ID del repository. I parametri sono definiti coppie chiave-valore, come api.sourceId=1234567890abcdef.

L'SDK di Google Cloud Search contiene diverse configurazioni fornite da Google utilizzati da tutti i connettori. Devi dichiarare quanto segue Parametri forniti da Google nel tuo file di configurazione:

  • Per un connettore di contenuti, devi dichiarare api.sourceId e api.serviceAccountPrivateKeyFile quando questi parametri identificano la località del repository e della chiave privata necessari per accedere al repository.
  • Per un connettore di identità, devi dichiarare api.identitySourceId come questo identifica la posizione dell'origine identità esterna. Se utenti sincronizzati, devi anche dichiarare api.customerId come ID univoco per l'account Google Workspace della tua azienda.

A meno che tu non voglia eseguire l'override dei valori predefiniti non occorre dichiararli nel file di configurazione. Per ulteriori informazioni sui parametri di configurazione forniti da Google, come come generare determinati ID e chiavi, consulta Parametri di configurazione forniti da Google.

Puoi anche definire parametri personalizzati per il repository da utilizzare nelle di configurazione del deployment.

Passa il file di configurazione al connettore

Imposta la proprietà di sistema config per trasferire il file di configurazione al tuo di rete. Puoi impostare la proprietà utilizzando l'argomento -D quando inizi il connettore. Ad esempio, il seguente comando avvia il connettore con il file di configurazione MyConfig.properties:

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

Se questo argomento non è presente, l'SDK tenta di accedere a una configurazione predefinita file denominato connector-config.properties.

Stabilire la strategia di attraversamento

La funzione principale di un connettore di contenuti è attraversare un repository indicizzarne i dati. Devi implementare una strategia di attraversamento basata sulle dimensioni e dei dati nel repository. Puoi elaborare la tua strategia oppure dalle seguenti strategie implementate nell'SDK:

Strategia di attraversamento completo

Una strategia di attraversamento completo analizza l'intero repository e indicizza in modo cieco ogni elemento. Questa strategia è di uso comune quando si dispone di un repository di piccole dimensioni può permettersi l'overhead per eseguire un attraversamento completo ogni volta che esegui l'indicizzazione.

Questa strategia di attraversamento è adatta a repository di piccole dimensioni con statici e non gerarchici. Puoi anche utilizzare questa strategia di attraversamento quando il rilevamento delle modifiche è difficile o non è supportato dal repository.

Strategia di attraversamento elenco

Una strategia di trasferimento elenco esegue la scansione dell'intero repository, inclusi tutti i file figlio nodi, determinando lo stato di ciascun elemento. Quindi, il connettore impiega un secondo passare e indicizza solo gli elementi nuovi o aggiornati dall'ultima dell'indicizzazione. Questa strategia viene comunemente utilizzata per eseguire aggiorna un indice esistente (anziché eseguire un attraversamento completo ogni volta che aggiorni l'indice).

Questa strategia di attraversamento è adatta quando il rilevamento delle modifiche è difficile o non supportati dal repository, hai dati non gerarchici lavorando con set di dati molto grandi.

Attraversamento grafico

Una strategia di attraversamento del grafico analizza l'intero nodo padre determinando lo stato di ogni articolo. Quindi, il connettore accetta una seconda passata e indicizza solo elementi nel nodo principale sono nuovi o sono stati aggiornati dopo l'ultima indicizzazione. Infine, il connettore passa tutti gli ID figlio e indicizza gli elementi nei nodi figlio. nuovi o aggiornati. Il connettore prosegue in modo ricorsivo per tutti i nodi figlio fino a gestire tutti gli elementi. Tale attraversamento è in genere utilizzato per repository gerarchici in cui l'elenco di tutti gli ID non pratici.

Questa strategia è adatta se si dispone di dati gerarchici che devono sottoposti a scansione, ad esempio una serie di directory o pagine web.

Ognuna di queste strategie di attraversamento viene implementata da un connettore di modelli nell'SDK. Anche se puoi implementare la tua strategia di attraversamento, questi velocizzano notevolmente lo sviluppo del connettore. A creare un connettore utilizzando un modello, passare alla sezione corrispondente la strategia di attraversamento:

Crea un connettore di attraversamento completo utilizzando una classe modello

Questa sezione della documentazione fa riferimento agli snippet di codice Esempio di FullTraversalSample.

Implementa il punto di ingresso del connettore

Il punto di ingresso di un connettore è main(). L'attività principale di questo metodo è creare un'istanza Application e richiamare la sua start() per eseguire il connettore.

Prima di chiamare application.start(), utilizza la IndexingApplication.Builder per creare un'istanza FullTraversalConnector modello. La FullTraversalConnector accetta un Repository di cui implementi i metodi. Il seguente snippet di codice mostra come per implementare il metodo main():

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

In background, l'SDK chiama initConfig() dopo le chiamate al metodo main() del connettore Application.build. La initConfig() metodo esegue le seguenti attività:

  1. Chiama il Configuation.isInitialized() per garantire che Configuration non è stato inizializzato.
  2. Inizializza un oggetto Configuration con la coppia chiave-valore fornita da Google in coppia. Ogni coppia chiave-valore è archiviata in ConfigValue all'interno dell'oggetto Configuration.

Implementa l'interfaccia di Repository

L'unico scopo dell'oggetto Repository è eseguire l'attraversamento e l'indicizzazione degli elementi del repository. Quando si utilizza un modello, devi sostituire solo alcuni metodi all'interno di Repository per creare un connettore di contenuti. I metodi da sostituire dipendono il modello e la strategia di attraversamento che utilizzi. Per FullTraversalConnector , sostituisci i seguenti metodi:

  • La init() . Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, sostituisci il init().

  • La getAllDocs() . Per attraversare e indicizzare tutti gli elementi nel repository di dati, sostituisci il metodo getAllDocs(). Questo metodo viene chiamato una volta per ogni attraversamento pianificato (come definito dalla tua configurazione).

  • (Facoltativo) Il campo getChanges() . Se il repository supporta il rilevamento delle modifiche, sostituisci il getChanges(). Questo metodo viene chiamato una volta per ogni incrementale pianificato attraversamento (come definito dalla tua configurazione) per recuperare gli elementi modificati e indicizzarle.

  • (Facoltativo) Il campo close() . Se devi eseguire la pulizia del repository, esegui l'override di close() . Questo metodo viene chiamato una volta durante l'arresto del connettore.

Ciascuno dei metodi L'oggetto Repository restituisce un tipo di ApiOperation . Un oggetto ApiOperation esegue un'azione sotto forma di singolo oggetto oppure forse più, IndexingService.indexItem() per eseguire l'indicizzazione effettiva del repository.

Ottieni parametri di configurazione personalizzati

Come parte della gestione della configurazione del connettore, dovrai ottenere parametri personalizzati Configuration . Questa attività viene solitamente eseguita in uno Repository del corso init().

La classe Configuration offre diversi metodi per ottenere diversi tipi di dati da una configurazione. Ogni metodo restituisce un oggetto ConfigValue. Poi utilizza il parametro ConfigValue dell'oggetto get() per recuperare il valore effettivo. Il seguente snippet, da FullTraversalSample, mostra come recuperare un singolo valore intero personalizzato da un oggetto Configuration:

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

Per ottenere e analizzare un parametro contenente più valori, utilizza uno dei Parser di tipo Configuration per analizzare i dati in blocchi discreti. Lo snippet seguente del connettore tutorial utilizza la classe getMultiValue per ottenere 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 override getAllDocs() eseguire un attraversamento completo e indicizzare il repository. getAllDocs() accetta un checkpoint. Il checkpoint viene utilizzato per riprendere l'indicizzazione in una un elemento specifico se il processo deve essere interrotto. Per ogni elemento repository Git, esegui questi passaggi nel getAllDocs()metodo:

  1. Imposta le autorizzazioni.
  2. Imposta i metadati per l'elemento che stai indicizzando.
  3. Combina i metadati e l'elemento in un'unica posizione indicizzabile RepositoryDoc
  4. Pacchettizza ogni elemento indicizzabile in un iteratore restituito da getAllDocs() . Tieni presente che getAllDocs() restituisce in realtà un CheckpointCloseableIterable ovvero un'iterazione ApiOperation di oggetti, ognuno dei quali rappresenta una richiesta API eseguita su RepositoryDoc, ad esempio l'indicizzazione.

Se l'insieme di elementi è troppo grande per essere elaborato in una singola chiamata, includi un'intestazione checkpoint e imposta hasMore(true) per indicare che sono disponibili più elementi per l'indicizzazione.

Impostare le autorizzazioni per un elemento

Il repository utilizza un elenco di controllo dell'accesso (ACL) per identificare gli utenti o gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.

Devi duplicare l'ACL utilizzato dal tuo repository per garantire che solo quegli utenti con accesso a un elemento possono visualizzarlo nei risultati di ricerca. La Durante l'indicizzazione di un elemento è necessario includere l'ACL di un elemento, in modo che Google Cloud Search abbia le informazioni necessarie per fornire il livello di accesso corretto dell'elemento.

L'SDK Content Connector fornisce un ricco set di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare l'ACL per ciascun elemento in del repository e crea un ACL corrispondente per Google Cloud Search indicizzare un elemento. Se l'ACL del repository utilizza concetti come ACL eredità, la modellazione dell'ACL può essere difficoltosa. Per ulteriori informazioni su Google per gli ACL di Cloud Search, consulta ACL di Google Cloud Search.

Nota:l'API Cloud Search Index supporta gli ACL a dominio singolo. Non e supportare gli ACL tra i domini. Utilizza la Acl.Builder per impostare l'accesso a ogni elemento utilizzando un ACL. Il seguente snippet di codice, utilizzato dal campione di attraversamento completo, consente tutti gli utenti o "entità" (getCustomerPrincipal()) essere "lettori" di tutti gli elementi (.setReaders()) quando esegue una ricerca.

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

Devi comprendere gli ACL per modellare correttamente gli ACL per il repository. Per Ad esempio, potresti indicizzare file all'interno di un file system che utilizza una sorta di modello di ereditarietà in cui le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà dell'ACL richiede ulteriori informazioni trattata in ACL di Google Cloud Search

Impostare i metadati per un elemento

I metadati sono archiviati in un oggetto Item. Per creare un Item, è necessaria una almeno un ID stringa, un tipo di elemento, ACL, URL e versione univoci per l'elemento. Il seguente snippet di codice mostra come creare un Item utilizzando il IndexingItemBuilder per la classe helper.

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

Dopo aver impostato i metadati per l'elemento, puoi creare l'elemento utilizzando RepositoryDoc.Builder . L'esempio seguente mostra come creare un singolo elemento indicizzabile.

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 tipo di ApiOperation che esegue effettivamente Richiesta IndexingService.indexItem().

Puoi utilizzare anche setRequestMode() del metodo RepositoryDoc.Builder per identificare la richiesta di indicizzazione come ASYNCHRONOUS o SYNCHRONOUS:

ASYNCHRONOUS
La modalità asincrona si traduce in una latenza di indicizzazione in pubblicazione più lunga e consente un'elevata quota di velocità effettiva per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
La modalità sincrona riduce la latenza di indicizzazione in fase di pubblicazione e supporta una quota di velocità effettiva limitata. La modalità sincrona è consigliato per l'indicizzazione di aggiornamenti e modifiche al repository. Se non specificata, la modalità di richiesta è SYNCHRONOUS per impostazione predefinita.

Pacchettizza ogni elemento indicizzabile in un iteratore

La getAllDocs() restituisce un Iterator, in particolare un CheckpointCloseableIterable di RepositoryDoc di oggetti strutturati. Puoi utilizzare lo CheckpointClosableIterableImpl.Builder per creare e restituire un iteratore. Il seguente snippet di codice mostra come per creare e restituire un iteratore.

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

L'SDK esegue ogni chiamata di indicizzazione racchiusa nell'iteratore.

Passaggi successivi

Di seguito sono riportati alcuni passaggi che puoi eseguire:

Crea un connettore di attraversamento elenco utilizzando una classe di modello

La coda di indicizzazione di Cloud Search viene utilizzata per contenere ID e hash facoltativo per ogni elemento del repository. Un connettore di attraversamento elenco esegue il push degli ID elemento alla coda di indicizzazione di Google Cloud Search e li recupera uno alla per l'indicizzazione. Google Cloud Search mantiene le code e Confrontare i contenuti della coda per determinare lo stato di un elemento, ad esempio se un elemento è stato sono state eliminate dal repository. Per ulteriori informazioni sul servizio Coda di indicizzazione, consulta La coda di indicizzazione di Cloud Search.

Questa sezione della documentazione fa riferimento agli snippet di codice ListTraversalSample esempio.

Implementa il punto di ingresso del connettore

Il punto di ingresso di un connettore è main(). L'attività principale di questo metodo è creare un'istanza Application e richiamare la sua start() per eseguire il connettore.

Prima di chiamare application.start(), utilizza la IndexingApplication.Builder per creare un'istanza ListingConnector modello. L'ListingConnector accetta un Repository di cui implementi i metodi. Il seguente snippet mostra come crea un'istanza di ListingConnector e del relativo Repository associato:

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

In background, l'SDK chiama initConfig() dopo le chiamate al metodo main() del connettore Application.build. Il metodo initConfig():

  1. Chiama il Configuation.isInitialized() per garantire che Configuration non è stato inizializzato.
  2. Inizializza un oggetto Configuration con la coppia chiave-valore fornita da Google in coppia. Ogni coppia chiave-valore è archiviata in ConfigValue all'interno dell'oggetto Configuration.

Implementa l'interfaccia di Repository

L'unico scopo dell'oggetto Repository è eseguire l'attraversamento e l'indicizzazione degli elementi del repository. Quando utilizzi un modello, devi solo eseguire l'override determinati metodi nell'interfaccia Repository per creare un connettore di contenuti. I metodi da sostituire dipendono dal modello e dalla strategia di attraversamento utilizzati. Per ListingConnector, sostituisci i seguenti metodi:

  • La init() . Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, sostituisci il init().

  • La getIds() . Per recuperare gli ID e i valori hash per tutti i record nel repository, sostituisci il metodo getIds().

  • La getDoc() . Per aggiungere nuovi elementi, aggiornare, modificare o eliminare elementi dall'indice, sostituisci la getDoc().

  • (Facoltativo) Il campo getChanges() . Se il repository supporta il rilevamento delle modifiche, sostituisci il getChanges(). Questo metodo viene chiamato una volta per ogni incrementale pianificato attraversamento (come definito dalla tua configurazione) per recuperare gli elementi modificati e indicizzarle.

  • (Facoltativo) Il campo close() . Se devi eseguire la pulizia del repository, esegui l'override di close() . Questo metodo viene chiamato una volta durante l'arresto del connettore.

Ciascuno dei metodi dell'oggetto Repository restituisce un qualche tipo di ApiOperation . Un oggetto ApiOperation esegue un'azione sotto forma di singolo oggetto oppure forse più, IndexingService.indexItem() per eseguire l'indicizzazione effettiva del repository.

Ottieni parametri di configurazione personalizzati

Come parte della gestione della configurazione del connettore, dovrai ottenere parametri personalizzati Configuration . Questa attività viene solitamente eseguita in uno Repository del corso init().

La classe Configuration offre diversi metodi per ottenere diversi tipi di dati da una configurazione. Ogni metodo restituisce un oggetto ConfigValue. Poi utilizza il parametro ConfigValue dell'oggetto get() per recuperare il valore effettivo. Il seguente snippet, da FullTraversalSample, mostra come recuperare un singolo valore intero personalizzato da un oggetto Configuration:

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

Per ottenere e analizzare un parametro contenente più valori, utilizza uno dei Parser di tipo Configuration per analizzare i dati in blocchi discreti. Lo snippet seguente del connettore tutorial utilizza la classe getMultiValue per ottenere un elenco di nomi di repository GitHub:

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

Eseguire il trasferimento elenco

Esegui override getIds() per recuperare gli ID e i valori hash per tutti i record nel repository. Il metodo getIds() accetta un checkpoint. Il checkpoint viene utilizzato per riprendere l'indicizzazione di un elemento specifico in caso di interruzione del processo.

Quindi, sostituisci getDoc() per gestire ogni elemento nella coda di indicizzazione di Cloud Search.

Invia ID elemento e valori hash

Esegui override getIds() per recuperare gli ID articolo e i relativi valori hash dei contenuti dalla repository Git. Le coppie ID e valore hash vengono quindi pacchettizzate in un'operazione push di Cloud Search alla coda di indicizzazione di Cloud Search. Gli ID radice o principali sono in genere inviato prima dagli ID figlio finché non è stata completata l'intera gerarchia elaborati.

Il metodo getIds() accetta un checkpoint che rappresenta l'ultimo elemento da indicizzati. Il checkpoint può essere utilizzato per riprendere l'indicizzazione in corrispondenza di un elemento specifico la procedura verrà interrotta. Per ogni elemento del repository, esegui queste operazioni: passaggi nel metodo getIds():

  • Recupera ogni ID elemento e il valore hash associato dal repository.
  • Pacchettizza ogni coppia ID e valore hash in una PushItems.
  • Combina ogni PushItems in un iteratore restituito dal getIds() . Tieni presente che getIds() restituisce in realtà un CheckpointCloseableIterable ovvero un'iterazione ApiOperation di oggetti, ognuno dei quali rappresenta una richiesta API eseguita su RepositoryDoc , ad esempio esegui il push degli elementi in coda.

Il seguente snippet di codice mostra come ottenere ogni ID articolo e valore hash e e inserirli in un PushItems Un PushItems è una richiesta ApiOperation per eseguire il push di un elemento a Cloud Search 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);
}

Il seguente snippet di codice mostra come utilizzare il parametro PushItems.Builder per pacchettizzare gli ID e i valori hash in un unico push ApiOperation.

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

Gli elementi vengono inviati alla coda di indicizzazione di Cloud Search per ulteriori elaborazioni.

Recupera e gestisci ogni elemento

Esegui override getDoc() per gestire ogni elemento nella coda di indicizzazione di Cloud Search. Un elemento può essere nuovo, modificato, non modificato o non esistere più nell'origine repository Git. Recupera e indicizza ogni elemento nuovo o modificato. Rimuovi elementi dell'indice che non esistono più nel repository di origine.

Il metodo getDoc() accetta un elemento da Google Cloud Search Coda di indicizzazione. Per ogni elemento in coda, esegui questi passaggi nella Metodo getDoc():

  1. Verificare se l'ID dell'elemento, nella coda di indicizzazione di Cloud Search, esiste nel repository. In caso contrario, elimina l'elemento dall'indice.

  2. Esegui un sondaggio nell'indice per verificare lo stato dell'elemento e, se un elemento non è stato modificato (ACCEPTED), non fare qualsiasi cosa.

  3. Indice modificato o nuovi elementi:

    1. Imposta le autorizzazioni.
    2. Imposta i metadati per l'elemento che stai indicizzando.
    3. Combina i metadati e l'elemento in un'unica posizione indicizzabile RepositoryDoc
    4. Restituisci RepositoryDoc.

Nota: il modello ListingConnector non supporta la restituzione di null su il metodo getDoc(). La restituzione di null comporta la restituzione di un NullPointerException.

Gestire gli elementi eliminati

Il seguente snippet di codice mostra come determinare se un elemento esiste nella repository e, in caso contrario, eliminarlo.

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

Tieni presente che documents è una struttura di dati che rappresenta il repository. Se documentID non trovato in documents, reso APIOperations.deleteItem(resourceName) per eliminare l'elemento dall'indice.

Gestire gli elementi che non sono stati modificati

Il seguente snippet di codice mostra come eseguire il sondaggio sullo stato degli elementi in Cloud Search di indicizzazione e gestire un elemento che non è stato modificato.

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

Per determinare se l'articolo non è stato modificato, controllane anche lo stato degli altri metadati che potrebbero indicare una modifica. Nell'esempio, i metadati per determinare se l'elemento è stato modificato.

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

Il repository utilizza un elenco di controllo dell'accesso (ACL) per identificare gli utenti o gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.

Devi duplicare l'ACL utilizzato dal tuo repository per garantire che solo quegli utenti con accesso a un elemento possono visualizzarlo nei risultati di ricerca. La Durante l'indicizzazione di un elemento è necessario includere l'ACL di un elemento, in modo che Google Cloud Search abbia le informazioni necessarie per fornire il livello di accesso corretto dell'elemento.

L'SDK Content Connector fornisce un ricco set di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare l'ACL per ciascun elemento in del repository e crea un ACL corrispondente per Google Cloud Search indicizzare un elemento. Se l'ACL del repository utilizza concetti come ACL eredità, la modellazione dell'ACL può essere difficoltosa. Per ulteriori informazioni su Google per gli ACL di Cloud Search, consulta ACL di Google Cloud Search.

Nota:l'API Cloud Search Index supporta gli ACL a dominio singolo. Non e supportare gli ACL tra i domini. Utilizza la Acl.Builder per impostare l'accesso a ogni elemento utilizzando un ACL. Il seguente snippet di codice, utilizzato dal campione di attraversamento completo, consente tutti gli utenti o "entità" (getCustomerPrincipal()) essere "lettori" di tutti gli elementi (.setReaders()) quando esegue una ricerca.

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

Devi comprendere gli ACL per modellare correttamente gli ACL per il repository. Per Ad esempio, potresti indicizzare file all'interno di un file system che utilizza una sorta di modello di ereditarietà in cui le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà dell'ACL richiede ulteriori informazioni trattata in ACL di Google Cloud Search

Impostare i metadati per un elemento

I metadati sono archiviati in un oggetto Item. Per creare un Item, è necessaria una almeno un ID stringa, un tipo di elemento, ACL, URL e versione univoci per l'elemento. Il seguente snippet di codice mostra come creare un Item utilizzando il IndexingItemBuilder per la classe helper.

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

Dopo aver impostato i metadati per l'elemento, puoi creare l'elemento utilizzando RepositoryDoc.Builder L'esempio seguente mostra come creare un singolo 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();

Un RepositoryDoc è un tipo di ApiOperation che esegue effettivamente IndexingService.indexItem() richiesta.

Puoi utilizzare anche setRequestMode() del metodo RepositoryDoc.Builder per identificare la richiesta di indicizzazione come ASYNCHRONOUS o SYNCHRONOUS:

ASYNCHRONOUS
La modalità asincrona si traduce in una latenza di indicizzazione in pubblicazione più lunga e consente un'elevata quota di velocità effettiva per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
La modalità sincrona riduce la latenza di indicizzazione in fase di pubblicazione e supporta una quota di velocità effettiva limitata. La modalità sincrona è consigliato per l'indicizzazione di aggiornamenti e modifiche al repository. Se non specificata, la modalità di richiesta è SYNCHRONOUS per impostazione predefinita.

Passaggi successivi

Di seguito sono riportati alcuni passaggi che puoi eseguire:

Crea un connettore di attraversamento grafico utilizzando una classe modello

La coda di indicizzazione di Cloud Search viene utilizzata per contenere ID e valori hash facoltativi di ogni elemento nel repository. Un connettore di attraversamento grafico invia gli ID elemento a la coda di indicizzazione di Google Cloud Search e li recupera uno alla volta dell'indicizzazione. Google Cloud Search gestisce le code e confronta i contenuti con Determinare lo stato di un elemento, ad esempio se è stato eliminato dalla repository Git. Per saperne di più sulla coda di indicizzazione di Cloud Search, consulta: a La coda di indicizzazione di Google Cloud Search.

Durante l'indice, i contenuti dell'elemento vengono recuperati dal repository di dati e da qualsiasi gli ID elemento secondari vengono inviati alla coda. Il connettore procede in modo ricorsivo elaborazione degli ID principali e secondari fino alla gestione di tutti gli elementi.

Questa sezione della documentazione fa riferimento agli snippet di codice GraphTraversalSample esempio.

Implementa il punto di ingresso del connettore

Il punto di ingresso di un connettore è main(). L'attività principale di questo metodo è creare un'istanza Application e richiamare la sua start() per eseguire il connettore.

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

Il seguente snippet mostra come crea un'istanza di ListingConnector e del relativo Repository associato:

GraphTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a graph
 * 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();
}

In background, l'SDK chiama initConfig() dopo le chiamate al metodo main() del connettore Application.build. Il metodo initConfig():

  1. Chiama il Configuation.isInitialized() per garantire che Configuration non è stato inizializzato.
  2. Inizializza un oggetto Configuration con la coppia chiave-valore fornita da Google in coppia. Ogni coppia chiave-valore è archiviata in ConfigValue all'interno dell'oggetto Configuration.

Implementa l'interfaccia di Repository

L'unico scopo del L'oggetto Repository deve eseguire l'attraversamento e l'indicizzazione del repository elementi. Quando utilizzi un modello, devi sostituire solo alcuni metodi all'interno delle Repository per creare un connettore di contenuti. I metodi che sostituisci dipendono dal modello e dalla strategia di attraversamento utilizzati. Per ListingConnector, puoi sostituire i seguenti metodi:

  • La init() . Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, sostituisci il init().

  • La getIds() . Per recuperare gli ID e i valori hash per tutti i record nel repository, sostituisci il metodo getIds().

  • La getDoc() . Per aggiungere nuovi elementi, aggiornare, modificare o eliminare elementi dall'indice, sostituisci la getDoc().

  • (Facoltativo) Il campo getChanges() . Se il repository supporta il rilevamento delle modifiche, sostituisci il getChanges(). Questo metodo viene chiamato una volta per ogni incrementale pianificato attraversamento (come definito dalla tua configurazione) per recuperare gli elementi modificati e indicizzarle.

  • (Facoltativo) Il campo close() . Se devi eseguire la pulizia del repository, esegui l'override di close() . Questo metodo viene chiamato una volta durante l'arresto del connettore.

Ciascuno dei metodi L'oggetto Repository restituisce un tipo di oggetto ApiOperation. ApiOperation che esegue un'azione sotto forma di una IndexingService.indexItem() per eseguire l'indicizzazione effettiva del repository.

Ottieni parametri di configurazione personalizzati

Come parte della gestione della configurazione del connettore, dovrai ottenere parametri personalizzati Configuration . Questa attività viene solitamente eseguita in uno Repository del corso init().

La classe Configuration offre diversi metodi per ottenere diversi tipi di dati da una configurazione. Ogni metodo restituisce un oggetto ConfigValue. Poi utilizza il parametro ConfigValue dell'oggetto get() per recuperare il valore effettivo. Il seguente snippet, da FullTraversalSample, mostra come recuperare un singolo valore intero personalizzato da un oggetto Configuration:

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

Per ottenere e analizzare un parametro contenente più valori, utilizza uno dei Parser di tipo Configuration per analizzare i dati in blocchi discreti. Lo snippet seguente del connettore tutorial utilizza la classe getMultiValue per ottenere un elenco di nomi di repository GitHub:

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

Eseguire l'attraversamento del grafico

Esegui override getIds() per recuperare gli ID e i valori hash per tutti i record nel repository. Il metodo getIds() accetta un checkpoint. Il checkpoint viene utilizzato per riprendere l'indicizzazione di un elemento specifico in caso di interruzione del processo.

Quindi, sostituisci getDoc() per gestire ogni elemento nella coda di indicizzazione di Cloud Search.

Invia ID elemento e valori hash

Esegui override getIds() per recuperare gli ID articolo e i relativi valori hash dei contenuti dalla repository Git. Le coppie ID e valore hash vengono quindi pacchettizzate in un'operazione push di Cloud Search alla coda di indicizzazione di Cloud Search. Gli ID radice o principali sono in genere inviato prima dagli ID figlio finché non è stata completata l'intera gerarchia elaborati.

Il metodo getIds() accetta un checkpoint che rappresenta l'ultimo elemento da indicizzati. Il checkpoint può essere utilizzato per riprendere l'indicizzazione in corrispondenza di un elemento specifico la procedura verrà interrotta. Per ogni elemento del repository, esegui queste operazioni: passaggi nel metodo getIds():

  • Recupera ogni ID elemento e il valore hash associato dal repository.
  • Pacchettizza ogni coppia ID e valore hash in una PushItems.
  • Combina ogni PushItems in un iteratore restituito dal Metodo getIds(). Tieni presente che getIds() restituisce in realtà un CheckpointCloseableIterable ovvero un'iterazione ApiOperation di oggetti, ognuno dei quali rappresenta una richiesta API eseguita su RepositoryDoc , ad esempio esegui il push degli elementi in coda.

Il seguente snippet di codice mostra come ottenere ogni ID articolo e valore hash e e inserirli in un PushItems. Un PushItems è un Richiesta ApiOperation per eseguire il push di un elemento alla coda di indicizzazione di Cloud Search.

GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);

Il seguente snippet di codice mostra come utilizzare il parametro PushItems.Builder per pacchettizzare gli ID e i valori hash in un unico push ApiOperation.

GraphTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();

Gli elementi vengono inviati alla coda di indicizzazione di Cloud Search per ulteriori elaborazioni.

Recupera e gestisci ogni elemento

Esegui override getDoc() per gestire ogni elemento nella coda di indicizzazione di Cloud Search. Un elemento può essere nuovo, modificato, non modificato o non esistere più nell'origine repository Git. Recupera e indicizza ogni elemento nuovo o modificato. Rimuovi elementi dell'indice che non esistono più nel repository di origine.

Il metodo getDoc() accetta un elemento dall'Indicizzazione di Cloud Search Coda. Per ogni elemento in coda, esegui questi passaggi nella Metodo getDoc():

  1. Verifica se l'ID dell'elemento, all'interno della coda di indicizzazione di Cloud Search, è presente nella repository Git. In caso contrario, elimina l'elemento dall'indice. Se l'elemento esiste, vai al passaggio successivo.

  2. Indice modificato o nuovi elementi:

    1. Imposta le autorizzazioni.
    2. Imposta i metadati per l'elemento che stai indicizzando.
    3. Combina i metadati e l'elemento in un'unica posizione indicizzabile RepositoryDoc
    4. Inserisci gli ID figlio nella coda di indicizzazione di Cloud Search per ulteriori elaborazioni.
    5. Restituisci RepositoryDoc.

Gestire gli elementi eliminati

Il seguente snippet di codice mostra come determinare se un elemento esiste nell'indice e non eliminarlo.

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

Impostare le autorizzazioni per un elemento

Il repository utilizza un elenco di controllo dell'accesso (ACL) per identificare gli utenti o gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.

Devi duplicare l'ACL utilizzato dal tuo repository per garantire che solo quegli utenti con accesso a un elemento possono visualizzarlo nei risultati di ricerca. La Durante l'indicizzazione di un elemento è necessario includere l'ACL di un elemento, in modo che Google Cloud Search abbia le informazioni necessarie per fornire il livello di accesso corretto dell'elemento.

L'SDK Content Connector fornisce un ricco set di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare l'ACL per ciascun elemento in del repository e crea un ACL corrispondente per Google Cloud Search indicizzare un elemento. Se l'ACL del repository utilizza concetti come ACL eredità, la modellazione dell'ACL può essere difficoltosa. Per ulteriori informazioni su Google per gli ACL di Cloud Search, consulta ACL di Google Cloud Search.

Nota:l'API Cloud Search Index supporta gli ACL a dominio singolo. Non e supportare gli ACL tra i domini. Utilizza la Acl.Builder per impostare l'accesso a ogni elemento utilizzando un ACL. Il seguente snippet di codice, utilizzato dal campione di attraversamento completo, consente tutti gli utenti o "entità" (getCustomerPrincipal()) essere "lettori" di tutti gli elementi (.setReaders()) quando esegue una ricerca.

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

Devi comprendere gli ACL per modellare correttamente gli ACL per il repository. Per Ad esempio, potresti indicizzare file all'interno di un file system che utilizza una sorta di modello di ereditarietà in cui le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà dell'ACL richiede ulteriori informazioni trattata in ACL di Google Cloud Search

Impostare i metadati per un elemento

I metadati sono archiviati in un oggetto Item. Per creare un Item, è necessaria una almeno un ID stringa, un tipo di elemento, ACL, URL e versione univoci per l'elemento. Il seguente snippet di codice mostra come creare un Item utilizzando il IndexingItemBuilder per la classe helper.

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

Crea l'elemento indicizzabile

Dopo aver impostato i metadati per l'elemento, puoi creare l'elemento utilizzando RepositoryDoc.Builder L'esempio seguente mostra come creare un singolo elemento indicizzabile.

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

Un RepositoryDoc è un tipo di ApiOperation che esegue effettivamente Richiesta IndexingService.indexItem().

Puoi utilizzare anche setRequestMode() del metodo RepositoryDoc.Builder per identificare la richiesta di indicizzazione come ASYNCHRONOUS o SYNCHRONOUS:

ASYNCHRONOUS
La modalità asincrona si traduce in una latenza di indicizzazione in pubblicazione più lunga e consente un'elevata quota di velocità effettiva per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
La modalità sincrona riduce la latenza di indicizzazione in fase di pubblicazione e supporta una quota di velocità effettiva limitata. La modalità sincrona è consigliato per l'indicizzazione di aggiornamenti e modifiche al repository. Se non specificata, la modalità di richiesta è SYNCHRONOUS per impostazione predefinita.

Inserisci gli ID figlio nella coda di indicizzazione di Cloud Search

Il seguente snippet di codice mostra come includere gli ID secondari, per l'elemento principale attualmente in elaborazione nella coda per l'elaborazione. Questi ID vengono elaborati dopo l'indicizzazione dell'elemento principale.

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

Passaggi successivi

Di seguito sono riportati alcuni passaggi che puoi eseguire:

crea un connettore di contenuti utilizzando l'API REST

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

Stabilire la strategia di attraversamento

La funzione principale di un connettore di contenuti è attraversare un repository indicizzarne i dati. Devi implementare una strategia di attraversamento basata sulle dimensioni e dei dati nel repository. Di seguito sono riportati i tre attraversamenti comuni strategie:

Strategia di attraversamento completo

Una strategia di attraversamento completo analizza l'intero repository e indicizza in modo cieco ogni elemento. Questa strategia è di uso comune quando si dispone di un repository di piccole dimensioni può permettersi l'overhead per eseguire un attraversamento completo ogni volta che esegui l'indicizzazione.

Questa strategia di attraversamento è adatta a repository di piccole dimensioni con statici e non gerarchici. Puoi anche utilizzare questa strategia di attraversamento quando il rilevamento delle modifiche è difficile o non è supportato dal repository.

Strategia di attraversamento elenco

Una strategia di trasferimento elenco esegue la scansione dell'intero repository, inclusi tutti i file figlio nodi, determinando lo stato di ciascun elemento. Quindi, il connettore impiega un secondo passare e indicizza solo gli elementi nuovi o aggiornati dall'ultima dell'indicizzazione. Questa strategia viene comunemente utilizzata per eseguire aggiorna un indice esistente (anziché eseguire un attraversamento completo ogni volta che aggiorni l'indice).

Questa strategia di attraversamento è adatta quando il rilevamento delle modifiche è difficile o non supportati dal repository, hai dati non gerarchici lavorando con set di dati molto grandi.

Attraversamento grafico

Una strategia di attraversamento del grafico analizza l'intero nodo padre determinando lo stato di ogni articolo. Quindi, il connettore accetta una seconda passata e indicizza solo elementi nel nodo principale sono nuovi o sono stati aggiornati dopo l'ultima indicizzazione. Infine, il connettore passa tutti gli ID figlio e indicizza gli elementi nei nodi figlio. nuovi o aggiornati. Il connettore prosegue in modo ricorsivo per tutti i nodi figlio fino a gestire tutti gli elementi. Tale attraversamento è in genere utilizzato per repository gerarchici in cui l'elenco di tutti gli ID non pratici.

Questa strategia è adatta se si dispone di dati gerarchici che devono sottoposti a scansione, ad esempio directory di serie o pagine web.

Implementazione della strategia di attraversamento e degli elementi di indice

Ogni elemento indicizzabile per Cloud Search viene chiamato elemento in l'API Cloud Search. Un elemento può essere un file, una cartella, una riga in un file CSV o un record di database.

Una volta registrato lo schema, puoi completare l'indice in base a:

  1. (Facoltativo) Con items.upload per caricare file di dimensioni superiori a 100 KiB per l'indicizzazione. Per i file più piccoli, incorpora i contenuti come inlineContent utilizzando items.index

  2. (Facoltativo) Con media.upload di caricare file multimediali da indicizzare.

  3. Utilizzo di items.index per indicizzare l'elemento. Ad esempio, se lo schema utilizza la definizione dell'oggetto nel filmato , una richiesta di indicizzazione per una singola avrà il seguente aspetto:

    {
      "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"
    }
    
  4. (Facoltativo) Utilizzare items.get chiamate per verificare un elemento che è stato indicizzato.

Per eseguire un attraversamento completo, reindicizza periodicamente l'intero repository Git. Per eseguire un attraversamento elenco o grafico, devi implementare per gestire le modifiche al repository.

Gestire le modifiche al repository

Puoi raccogliere e indicizzare periodicamente ogni elemento da un repository per eseguire l'indicizzazione completa. Sebbene efficace nel garantire che l'indice sia aggiornato, una l'indicizzazione può essere costosa quando si gestiscono repository più grandi o gerarchici.

Anziché utilizzare di tanto in tanto chiamate di indice per indicizzare un intero repository, puoi anche utilizzare la coda di indicizzazione di Google Cloud come meccanismo per tenere traccia delle modifiche e indicizzare solo gli elementi che hanno è cambiato. Puoi utilizzare lo items.push richieste di push di elementi in coda per il polling e l'aggiornamento successivi. Per maggiori informazioni informazioni sulla coda di indicizzazione di Google Cloud, consulta Coda di indicizzazione di Google Cloud.

Per saperne di più sull'API Google Cloud Search, consulta: API Cloud Search.