Un connettore di contenuti è un programma software utilizzato per attraversare i dati in un repository aziendale e popolare un'origine dati. Google offre le seguenti opzioni per lo sviluppo di connettori di contenuti:
L'SDK Content Connector. Questa è una buona opzione se programmi in Java. L'SDK Content Connector è un wrapper attorno all'API REST che ti consente di creare rapidamente connettori. Per creare un connettore di contenuti utilizzando l'SDK, consulta Creare un connettore di contenuti utilizzando l'SDK Content Connector.
Un'API REST di basso livello o librerie API. Utilizza queste opzioni se non programmi in Java o se il tuo codebase si adatta meglio a un'API REST o a una libreria. Per creare un connettore di contenuti utilizzando l'API REST, consulta Creare un connettore di contenuti utilizzando l'API REST.
Un tipico connettore di contenuti esegue le seguenti attività:
- Legge ed elabora i parametri di configurazione.
- Estrae blocchi discreti di dati indicizzabili, chiamati "elementi", dal repository di contenuti di terze parti.
- Combina ACL, metadati e dati dei contenuti in elementi indicizzabili.
- Indicizza gli elementi nell'origine dati Cloud Search.
- (facoltativo) Ascolta le notifiche di modifica dal repository di contenuti di terze parti. Le notifiche di modifica vengono convertite in richieste di indicizzazione per mantenere l'origine dati Cloud Search sincronizzata con il repository di terze parti. 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 Content Connector SDK.
Configurare le dipendenze
Per utilizzare l'SDK, devi includere determinate dipendenze nel file di build. Fai clic su una scheda di seguito per visualizzare le dipendenze per l'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 ha un file di configurazione contenente i parametri utilizzati dal
connettore, ad esempio l'ID del repository. I parametri sono definiti come coppie
chiave-valore, ad esempio
api.sourceId=1234567890abcdef
.
L'SDK Google Cloud Search contiene diversi parametri di configurazione forniti da Google utilizzati da tutti i connettori. Devi dichiarare i seguenti parametri forniti da Google nel file di configurazione:
- Per un connettore di contenuti, devi dichiarare
api.sourceId
eapi.serviceAccountPrivateKeyFile
, in quanto questi parametri identificano la posizione del repository e della chiave privata necessaria per accedervi.
- Per un connettore di identità, devi dichiarare
api.identitySourceId
perché questo parametro identifica la posizione dell'origine identità esterna. Se stai sincronizzando gli utenti, devi anche dichiarareapi.customerId
come ID univoco per l'account Google Workspace della tua azienda.
A meno che tu non voglia sostituire i valori predefiniti di altri parametri forniti da Google, non devi dichiararli nel file di configurazione. Per ulteriori informazioni sui parametri di configurazione forniti da Google, ad esempio su come generare determinati ID e chiavi, consulta Parametri di configurazione forniti da Google.
Puoi anche definire parametri specifici del repository da utilizzare nel file di configurazione.
Trasferisci il file di configurazione al connettore
Imposta la proprietà di sistema config
per passare il file di configurazione al connettore. Puoi impostare la proprietà utilizzando l'argomento -D
quando avvii
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 un file di configurazione
predefinito denominato connector-config.properties
.
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 di attraversamento basata sulle dimensioni e sul layout dei dati nel repository. Puoi progettare la tua strategia o scegliere tra le seguenti strategie implementate nell'SDK:
- Strategia di attraversamento completo
Una strategia di attraversamento completo esamina l'intero repository e indicizza ciecamente ogni elemento. Questa strategia viene comunemente utilizzata quando hai un repository di piccole dimensioni e puoi permetterti l'overhead di eseguire un attraversamento completo ogni volta che esegui l'indicizzazione.
Questa strategia di attraversamento è adatta a repository di piccole dimensioni con dati per lo più 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 degli elenchi
Una strategia di attraversamento dell'elenco esamina l'intero repository, inclusi tutti i nodi secondari, determinando lo stato di ogni elemento. Successivamente, il connettore esegue una seconda passata e indicizza solo gli elementi nuovi o aggiornati dall'ultima indicizzazione. Questa strategia viene comunemente utilizzata per eseguire aggiornamenti incrementali a un indice esistente (invece di dover eseguire un attraversamento completo ogni volta che aggiorni l'indice).
Questa strategia di attraversamento è adatta quando il rilevamento delle modifiche è difficile o non supportato dal repository, quando hai dati non gerarchici e quando lavori con set di dati molto grandi.
- Attraversamento del grafico
Una strategia di attraversamento del grafico esamina l'intero nodo principale determinando lo stato di ogni elemento. Successivamente, il connettore esegue una seconda passata e indicizza solo gli elementi nel nodo radice che sono nuovi o sono stati aggiornati dall'ultima indicizzazione. Infine, il connettore passa tutti gli ID secondari e poi indicizza gli elementi nei nodi secondari che sono nuovi o sono stati aggiornati. Il connettore continua in modo ricorsivo in tutti i nodi secondari finché non sono stati gestiti tutti gli elementi. Questo attraversamento viene in genere utilizzato per i repository gerarchici in cui l'elenco di tutti gli ID non è pratico.
Questa strategia è adatta se hai dati gerarchici che devono essere scansionati, ad esempio una serie di directory o pagine web.
Ciascuna di queste strategie di attraversamento viene implementata da una classe di connettore di modelli nell'SDK. Sebbene tu possa implementare la tua strategia di attraversamento, questi modelli velocizzano notevolmente lo sviluppo del connettore. Per creare un connettore utilizzando un modello, vai alla sezione corrispondente alla tua strategia di attraversamento:
- Creare un connettore di attraversamento completo utilizzando una classe modello
- Creare un connettore di attraversamento di elenchi utilizzando una classe modello
- Creare un connettore di attraversamento del grafico utilizzando una classe modello
Creare un connettore di attraversamento completo utilizzando una classe modello
Questa sezione della documentazione fa riferimento agli snippet di codice dell'esempio FullTraversalSample.
Implementa il punto di ingresso del connettore
L'entry point di un connettore è il metodo
main()
. Il compito principale di questo metodo è creare un'istanza della classe
Application
e richiamare il relativo metodo
start()
per eseguire il connettore.
Prima di chiamare
application.start()
,
utilizza la classe
IndexingApplication.Builder
per creare un'istanza
del modello
FullTraversalConnector
. Il
FullTraversalConnector
accetta un
oggetto
Repository
di cui implementi i metodi. Il seguente snippet di codice mostra come
implementare il metodo main()
:
Dietro le quinte, l'SDK chiama il metodo
initConfig()
dopo che il metodo main()
del connettore chiama
Application.build
.
Il metodo
initConfig()
esegue le seguenti attività:
- Chiama il metodo
Configuation.isInitialized()
per assicurarsi cheConfiguration
non sia stato inizializzato. - Inizializza un oggetto
Configuration
con le coppie chiave-valore fornite da Google. Ogni coppia chiave-valore è archiviata in un oggettoConfigValue
all'interno dell'oggettoConfiguration
.
Implementa l'interfaccia Repository
L'unico scopo dell'oggetto Repository
è eseguire l'attraversamento e
l'indicizzazione degli elementi del repository. Quando utilizzi
un modello, devi sostituire solo determinati metodi all'interno dell'interfaccia Repository
per creare un connettore di contenuti. I metodi che esegui l'override dipendono dal modello e dalla strategia di attraversamento che utilizzi. Per
FullTraversalConnector
, esegui l'override dei seguenti metodi:
Il metodo
init()
. Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, esegui l'override del metodoinit()
.Il metodo
getAllDocs()
. Per attraversare e indicizzare tutti gli elementi nel repository di dati, esegui l'override del metodogetAllDocs()
. Questo metodo viene chiamato una volta per ogni attraversamento pianificato (come definito dalla configurazione).(facoltativo) Il metodo
getChanges()
. Se il repository supporta il rilevamento delle modifiche, esegui l'override del metodogetChanges()
. Questo metodo viene chiamato una volta per ogni attraversamento incrementale pianificato (come definito dalla configurazione) per recuperare gli elementi modificati e indicizzarli.(facoltativo) Il metodo
close()
. Se devi eseguire la pulizia del repository, esegui l'override del metodoclose()
. Questo metodo viene chiamato una volta durante l'arresto del connettore.
Ciascuno dei metodi dell'oggetto
Repository
restituisce un tipo di oggetto
ApiOperation
. Un oggetto ApiOperation
esegue un'azione sotto forma di una o più chiamate IndexingService.indexItem()
per eseguire l'indicizzazione effettiva del repository.
Ottenere parametri di configurazione personalizzati
Nell'ambito della gestione della configurazione del connettore, dovrai recuperare tutti i parametri personalizzati dall'oggetto
Configuration
. Questa attività viene solitamente eseguita nel metodo
Repository
della
classe
init()
.
La classe Configuration
ha diversi metodi per ottenere diversi tipi di dati
da una configurazione. Ogni metodo restituisce un oggetto ConfigValue
. Quindi, utilizza il metodo get()
dell'oggetto ConfigValue
per recuperare il valore effettivo.
Il seguente snippet, tratto da
FullTraversalSample
,
mostra come recuperare un
singolo valore intero personalizzato da un oggetto Configuration
:
Per ottenere e analizzare un parametro contenente più valori, utilizza uno degli analizzatori di tipo della classe Configuration
per analizzare i dati in blocchi discreti.
Il seguente snippet, dal connettore del tutorial, utilizza il metodo
getMultiValue
per ottenere un elenco di nomi di repository GitHub:
Eseguire una traversata completa
Esegui l'override di
getAllDocs()
per eseguire un attraversamento completo e indicizzare il repository. Il metodo getAllDocs()
accetta un checkpoint. Il checkpoint viene utilizzato per riprendere l'indicizzazione di un elemento specifico in caso di interruzione della procedura. Per ogni elemento del repository, esegui questi passaggi nel metodo getAllDocs()
:
- Imposta le autorizzazioni.
- Imposta i metadati per l'elemento che stai indicizzando.
- Combina i metadati e l'elemento in un
RepositoryDoc
indicizzabile. - Inserisci ogni elemento indicizzabile in un iteratore restituito dal metodo
getAllDocs()
. Tieni presente chegetAllDocs()
restituisce in realtà unCheckpointCloseableIterable
che è un'iterazione diApiOperation
di oggetti, ognuno dei quali rappresenta una richiesta API eseguita su unRepositoryDoc
, ad esempio l'indicizzazione.
Se l'insieme di elementi è troppo grande per essere elaborato in una singola chiamata, includi un
checkpoint e imposta
hasMore(true)
per indicare che sono disponibili altri 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 i gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.
Devi duplicare la ACL utilizzata dal repository per assicurarti che solo gli utenti con accesso a un elemento possano visualizzarlo in un risultato di ricerca. L'elenco di controllo degli accessi per un elemento deve essere incluso durante l'indicizzazione di un elemento in modo che Google Cloud Search disponga delle informazioni necessarie per fornire il livello di accesso corretto all'elemento.
L'SDK Content Connector fornisce un ricco insieme di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare la ACL per ogni elemento del repository e creare una ACL corrispondente per Google Cloud Search quando indicizzi un elemento. Se l'ACL del repository utilizza concetti come l'ereditarietà dell'ACL, la modellazione dell'ACL può essere complicata. Per ulteriori informazioni sugli ACL di Google Cloud Search, consulta ACL di Google Cloud Search.
Nota:l'API Cloud Search Indexing supporta gli elenchi di controllo dell'accesso (ACL) per un singolo dominio. Non supporta
le ACL cross-domain. Utilizza la classe
Acl.Builder
per impostare l'accesso a ogni elemento utilizzando un ACL. Lo snippet di codice riportato di seguito, tratto dall'esempio di attraversamento completo, consente a tutti gli utenti o "principali" (getCustomerPrincipal()
) di essere "lettori" di tutti gli elementi (.setReaders()
) durante l'esecuzione di una ricerca.
Devi comprendere gli ACL per modellarli correttamente per il repository. Ad esempio, potresti indicizzare file all'interno di un file system che utilizza un modello di ereditarietà in base al quale le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà degli ACL richiede informazioni aggiuntive trattate in ACL di Google Cloud Search
Impostare i metadati per un elemento
I metadati vengono archiviati in un oggetto Item
. Per creare un Item
, devi disporre
almeno di un ID stringa univoco, un tipo di elemento, un ACL, un URL e una versione per l'elemento.
Il seguente snippet di codice mostra come creare un Item
utilizzando la classe helper
IndexingItemBuilder
.
Crea l'elemento indicizzabile
Una volta impostati i metadati per l'elemento, puoi creare l'elemento
indicizzabile effettivo utilizzando la
classe RepositoryDoc.Builder
. Il seguente esempio mostra come creare un singolo elemento indicizzabile.
Un RepositoryDoc
è un tipo di ApiOperation
che esegue la richiesta IndexingService.indexItem()
effettiva.
Puoi anche utilizzare il metodo
setRequestMode()
della classe
RepositoryDoc.Builder
per identificare la richiesta di indicizzazione come ASYNCHRONOUS
o SYNCHRONOUS
:
ASYNCHRONOUS
- La modalità asincrona comporta una latenza più lunga dall'indicizzazione alla pubblicazione e consente una quota di throughput elevata per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
- La modalità sincrona comporta una latenza di indicizzazione e pubblicazione più breve e
consente di gestire una quota di velocità effettiva limitata. La modalità sincrona è
consigliata per l'indicizzazione di aggiornamenti e modifiche al repository. Se
non specificata, la modalità di richiesta predefinita è
SYNCHRONOUS
.
Inserisci ogni elemento indicizzabile in un iteratore
Il metodo getAllDocs()
restituisce un Iterator
, in particolare un CheckpointCloseableIterable
, di oggetti RepositoryDoc
. Puoi utilizzare la classe
CheckpointClosableIterableImpl.Builder
per costruire e restituire un iteratore. Il seguente snippet di codice mostra come
costruire e restituire un iteratore.
L'SDK esegue ogni chiamata di indicizzazione racchiusa all'interno dell'iteratore.
Passaggi successivi
Ecco alcuni passaggi successivi che puoi intraprendere:
- (Facoltativo) Se la velocità effettiva di indicizzazione sembra lenta, consulta Aumentare la velocità di indicizzazione per
FullTraversalConnector
. - (Facoltativo) Implementa il metodo
close()
per rilasciare le risorse prima dell'arresto. - (facoltativo) Crea un connettore di identità utilizzando l'SDK Content Connector.
Creare un connettore di attraversamento di elenchi utilizzando una classe modello
La coda di indicizzazione di Cloud Search viene utilizzata per contenere ID e valori hash facoltativi per ogni elemento del repository. Un connettore di attraversamento dell'elenco 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 ulteriori informazioni sulla coda di indicizzazione di Cloud Search, consulta La coda di indicizzazione di Cloud Search.
Questa sezione della documentazione fa riferimento agli snippet di codice dell'esempio ListTraversalSample.
Implementa il punto di ingresso del connettore
L'entry point di un connettore è il metodo
main()
. Il compito principale di questo metodo è creare un'istanza della classe
Application
e richiamare 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. Il seguente snippet mostra come
creare un'istanza di ListingConnector
e del relativo Repository
:
Dietro le quinte, l'SDK chiama il metodo
initConfig()
dopo che il metodo main()
del connettore chiama
Application.build
.
Il metodo initConfig()
:
- Chiama il metodo
Configuation.isInitialized()
per assicurarsi cheConfiguration
non sia stato inizializzato. - Inizializza un oggetto
Configuration
con le coppie chiave-valore fornite da Google. Ogni coppia chiave-valore è archiviata in un oggettoConfigValue
all'interno dell'oggettoConfiguration
.
Implementa l'interfaccia 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 di determinati metodi all'interno dell'interfacciaRepository
per creare un connettore di contenuti.
I metodi che esegui l'override dipendono dal modello e dalla strategia di attraversamento che utilizzi. Per
ListingConnector
,
sostituisci i seguenti metodi:
Il metodo
init()
. Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, esegui l'override del metodoinit()
.Il metodo
getIds()
. Per recuperare gli ID e i valori hash di tutti i record nel repository, esegui l'override del metodogetIds()
.Il metodo
getDoc()
. Per aggiungere, aggiornare, modificare o eliminare elementi dall'indice, esegui l'override del metodogetDoc()
.(facoltativo) Il metodo
getChanges()
. Se il repository supporta il rilevamento delle modifiche, esegui l'override del metodogetChanges()
. Questo metodo viene chiamato una volta per ogni attraversamento incrementale pianificato (come definito dalla configurazione) per recuperare gli elementi modificati e indicizzarli.(facoltativo) Il metodo
close()
. Se devi eseguire la pulizia del repository, esegui l'override del metodoclose()
. Questo metodo viene chiamato una volta durante l'arresto del connettore.
Ciascuno dei metodi dell'oggetto Repository
restituisce un tipo di oggetto
ApiOperation
. Un oggetto ApiOperation
esegue un'azione sotto forma di una o più chiamate IndexingService.indexItem()
per eseguire l'indicizzazione effettiva del repository.
Ottenere parametri di configurazione personalizzati
Nell'ambito della gestione della configurazione del connettore, dovrai recuperare tutti i parametri personalizzati dall'oggetto
Configuration
. Questa attività viene solitamente eseguita nel metodo
Repository
della
classe
init()
.
La classe Configuration
ha diversi metodi per ottenere diversi tipi di dati
da una configurazione. Ogni metodo restituisce un oggetto ConfigValue
. Quindi, utilizza il metodo get()
dell'oggetto ConfigValue
per recuperare il valore effettivo.
Il seguente snippet, tratto da
FullTraversalSample
,
mostra come recuperare un
singolo valore intero personalizzato da un oggetto Configuration
:
Per ottenere e analizzare un parametro contenente più valori, utilizza uno degli analizzatori di tipo della classe Configuration
per analizzare i dati in blocchi discreti.
Il seguente snippet, dal connettore del tutorial, utilizza il metodo
getMultiValue
per ottenere un elenco di nomi di repository GitHub:
Eseguire l'attraversamento della lista
Esegui l'override del metodo
getIds()
per recuperare gli ID e i valori hash di 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 della procedura.
Successivamente, esegui l'override del metodo
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 gli ID articolo e i relativi valori hash dei contenuti dal
repository. Le coppie ID e valore hash vengono quindi raggruppate in un'operazione push
richiesta alla coda di indicizzazione di Cloud Search. Gli ID radice o principali vengono in genere
inseriti per primi, seguiti dagli ID secondari, finché non viene elaborata l'intera gerarchia degli elementi.
Il metodo getIds()
accetta un checkpoint che rappresenta l'ultimo elemento da
indicizzare. Il checkpoint può essere utilizzato per riprendere l'indicizzazione di un elemento specifico in caso di interruzione del processo. Per ogni elemento del repository, esegui questi passaggi nel metodo getIds()
:
- Recupera l'ID di ogni elemento e il valore hash associato dal repository.
- Raggruppa ogni coppia di ID e valore hash in un
PushItems
. - Combina ogni
PushItems
in un iteratore restituito dal metodogetIds()
. Tieni presente chegetIds()
restituisce in realtà unCheckpointCloseableIterable
che è un'iterazione diApiOperation
oggetti, ognuno dei quali rappresenta una richiesta API eseguita su unRepositoryDoc
, ad esempio l'inserimento degli elementi nella coda.
Il seguente snippet di codice mostra come ottenere l'ID e il valore hash di ogni elemento e
inserirli in un
PushItems
.
Un PushItems
è una richiesta ApiOperation
per inserire un elemento nella coda di indicizzazione di Cloud Search.
Il seguente snippet di codice mostra come utilizzare la classe
PushItems.Builder
per raggruppare gli ID e i valori hash in un unico push
ApiOperation
.
Gli elementi vengono inseriti nella coda di indicizzazione di Cloud Search per l'ulteriore elaborazione.
Recuperare e gestire ogni elemento
Esegui l'override di
getDoc()
per gestire ogni elemento nella coda di indicizzazione di Cloud Search.
Un elemento può essere nuovo, modificato, invariato o non esistere più nel repository di origine. Recupera e indicizza ogni elemento nuovo o modificato. Rimuovi gli elementi
dall'indice che non esistono più nel repository di origine.
Il metodo getDoc()
accetta un elemento dalla coda di indicizzazione di Google Cloud Search. Per ogni elemento della coda, esegui questi passaggi nel metodo
getDoc()
:
Verifica se l'ID dell'elemento nella coda di indicizzazione di Cloud Search esiste nel repository. In caso contrario, elimina l'elemento dall'indice.
Esegui il sondaggio dell'indice per lo stato dell'elemento e, se un elemento è invariato (
ACCEPTED
), non fare nulla.Indice modificato o nuovi elementi:
- Imposta le autorizzazioni.
- Imposta i metadati per l'elemento che stai indicizzando.
- Combina i metadati e l'elemento in un
RepositoryDoc
indicizzabile. - Restituisci
RepositoryDoc
.
Nota:il modello ListingConnector
non supporta la restituzione di null
nel metodo getDoc()
. La restituzione di null
risultati comporta un NullPointerException.
Gestire gli elementi eliminati
Il seguente snippet di codice mostra come determinare se un elemento esiste nel repository e, in caso contrario, eliminarlo.
Tieni presente che documents
è una struttura di dati che rappresenta il repository. Se
documentID
non viene trovato in documents
, restituisci
APIOperations.deleteItem(resourceName)
per eliminare l'elemento dall'indice.
Gestire gli elementi non modificati
Il seguente snippet di codice mostra come eseguire il polling dello stato degli elementi nella coda di indicizzazione di Cloud Search e gestire un elemento invariato.
Per determinare se l'elemento è invariato, controlla lo stato dell'elemento e altri metadati che potrebbero indicare una modifica. Nell'esempio, l'hash dei metadati viene utilizzato per determinare se l'elemento è stato modificato.
Impostare le autorizzazioni per un elemento
Il repository utilizza un elenco di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.
Devi duplicare la ACL utilizzata dal repository per assicurarti che solo gli utenti con accesso a un elemento possano visualizzarlo in un risultato di ricerca. L'elenco di controllo degli accessi per un elemento deve essere incluso durante l'indicizzazione di un elemento in modo che Google Cloud Search disponga delle informazioni necessarie per fornire il livello di accesso corretto all'elemento.
L'SDK Content Connector fornisce un ricco insieme di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare la ACL per ogni elemento del repository e creare una ACL corrispondente per Google Cloud Search quando indicizzi un elemento. Se l'ACL del repository utilizza concetti come l'ereditarietà dell'ACL, la modellazione dell'ACL può essere complicata. Per ulteriori informazioni sugli ACL di Google Cloud Search, consulta ACL di Google Cloud Search.
Nota:l'API Cloud Search Indexing supporta gli elenchi di controllo dell'accesso (ACL) per un singolo dominio. Non supporta
le ACL cross-domain. Utilizza la classe
Acl.Builder
per impostare l'accesso a ogni elemento utilizzando un ACL. Lo snippet di codice riportato di seguito, tratto dall'esempio di attraversamento completo, consente a tutti gli utenti o "principali" (getCustomerPrincipal()
) di essere "lettori" di tutti gli elementi (.setReaders()
) durante l'esecuzione di una ricerca.
Devi comprendere gli ACL per modellarli correttamente per il repository. Ad esempio, potresti indicizzare file all'interno di un file system che utilizza un modello di ereditarietà in base al quale le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà degli ACL richiede informazioni aggiuntive trattate in ACL di Google Cloud Search
Impostare i metadati per un elemento
I metadati vengono archiviati in un oggetto Item
. Per creare un Item
, devi disporre
almeno di un ID stringa univoco, un tipo di elemento, un ACL, un URL e una versione per l'elemento.
Il seguente snippet di codice mostra come creare un Item
utilizzando la classe helper
IndexingItemBuilder
.
Creare un elemento indicizzabile
Una volta impostati i metadati per l'elemento, puoi creare l'elemento
indicizzabile effettivo utilizzando
RepositoryDoc.Builder
.
Il seguente esempio mostra come creare un singolo elemento indicizzabile.
Un RepositoryDoc
è un tipo di
ApiOperation
che esegue la richiesta
IndexingService.indexItem()
effettiva.
Puoi anche utilizzare il metodo
setRequestMode()
della classe
RepositoryDoc.Builder
per identificare la richiesta di indicizzazione come ASYNCHRONOUS
o SYNCHRONOUS
:
ASYNCHRONOUS
- La modalità asincrona comporta una latenza più lunga dall'indicizzazione alla pubblicazione e consente una quota di throughput elevata per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
- La modalità sincrona comporta una latenza di indicizzazione e pubblicazione più breve e
consente di gestire una quota di velocità effettiva limitata. La modalità sincrona è
consigliata per l'indicizzazione di aggiornamenti e modifiche al repository. Se
non specificata, la modalità di richiesta predefinita è
SYNCHRONOUS
.
Passaggi successivi
Ecco alcuni passaggi successivi che puoi intraprendere:
- (Facoltativo) Implementa il metodo
close()
per rilasciare le risorse prima dell'arresto. - (facoltativo) Crea un connettore di identità utilizzando l'SDK Content Connector.
Creare un connettore di attraversamento del grafico utilizzando una classe modello
La coda di indicizzazione di Cloud Search viene utilizzata per contenere ID e valori hash facoltativi per ogni elemento nel 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 ulteriori informazioni sulla coda di indicizzazione di Cloud Search, consulta l'articolo 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 procede in modo ricorsivo elaborando gli ID principali e secondari fino a quando tutti gli elementi non vengono gestiti.
Questa sezione della documentazione fa riferimento agli snippet di codice dell'esempio GraphTraversalSample.
Implementa il punto di ingresso del connettore
L'entry point di un connettore è il metodo
main()
. Il compito principale di questo metodo è creare un'istanza della classe
Application
e richiamare 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
. Il
ListingConnector
accetta un
oggetto
Repository
di cui implementi i metodi.
Il seguente snippet mostra come
creare un'istanza di ListingConnector
e del relativo Repository
:
Dietro le quinte, l'SDK chiama il metodo
initConfig()
dopo che il metodo main()
del connettore chiama
Application.build
.
Il metodo initConfig()
:
- Chiama il metodo
Configuation.isInitialized()
per assicurarsi cheConfiguration
non sia stato inizializzato. - Inizializza un oggetto
Configuration
con le coppie chiave-valore fornite da Google. Ogni coppia chiave-valore è archiviata in un oggettoConfigValue
all'interno dell'oggettoConfiguration
.
Implementa l'interfaccia Repository
L'unico scopo dell'oggetto
Repository
è eseguire l'attraversamento e l'indicizzazione degli elementi del repository. Quando utilizzi un modello, devi eseguire l'override solo di determinati metodi all'interno dell'interfaccia
Repository
per creare un connettore di contenuti. I metodi che esegui l'override
dipendono dal modello e dalla strategia di attraversamento che utilizzi. Per
ListingConnector
,
esegui l'override dei seguenti metodi:
Il metodo
init()
. Per eseguire qualsiasi configurazione e inizializzazione del repository di dati, esegui l'override del metodoinit()
.Il metodo
getIds()
. Per recuperare gli ID e i valori hash di tutti i record nel repository, esegui l'override del metodogetIds()
.Il metodo
getDoc()
. Per aggiungere, aggiornare, modificare o eliminare elementi dall'indice, esegui l'override del metodogetDoc()
.(facoltativo) Il metodo
getChanges()
. Se il repository supporta il rilevamento delle modifiche, esegui l'override del metodogetChanges()
. Questo metodo viene chiamato una volta per ogni attraversamento incrementale pianificato (come definito dalla configurazione) per recuperare gli elementi modificati e indicizzarli.(facoltativo) Il metodo
close()
. Se devi eseguire la pulizia del repository, esegui l'override del metodoclose()
. Questo metodo viene chiamato una volta durante l'arresto del connettore.
Ciascuno dei metodi dell'oggetto
Repository
restituisce un tipo di oggetto ApiOperation
. Un oggetto ApiOperation
esegue un'azione sotto forma di una o più chiamate
IndexingService.indexItem()
per eseguire l'indicizzazione effettiva del repository.
Ottenere parametri di configurazione personalizzati
Nell'ambito della gestione della configurazione del connettore, dovrai recuperare tutti i parametri personalizzati dall'oggetto
Configuration
. Questa attività viene solitamente eseguita nel metodo
Repository
della
classe
init()
.
La classe Configuration
ha diversi metodi per ottenere diversi tipi di dati
da una configurazione. Ogni metodo restituisce un oggetto ConfigValue
. Quindi, utilizza il metodo get()
dell'oggetto ConfigValue
per recuperare il valore effettivo.
Il seguente snippet, tratto da
FullTraversalSample
,
mostra come recuperare un
singolo valore intero personalizzato da un oggetto Configuration
:
Per ottenere e analizzare un parametro contenente più valori, utilizza uno degli analizzatori di tipo della classe Configuration
per analizzare i dati in blocchi discreti.
Il seguente snippet, dal connettore del tutorial, utilizza il metodo
getMultiValue
per ottenere un elenco di nomi di repository GitHub:
Esegui l'attraversamento del grafico
Esegui l'override del metodo
getIds()
per recuperare gli ID e i valori hash di 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 della procedura.
Successivamente, esegui l'override del metodo
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 gli ID articolo e i relativi valori hash dei contenuti dal
repository. Le coppie ID e valore hash vengono quindi raggruppate in un'operazione push
richiesta alla coda di indicizzazione di Cloud Search. Gli ID radice o principali vengono in genere
inseriti per primi, seguiti dagli ID secondari, finché non viene elaborata l'intera gerarchia degli elementi.
Il metodo getIds()
accetta un checkpoint che rappresenta l'ultimo elemento da
indicizzare. Il checkpoint può essere utilizzato per riprendere l'indicizzazione di un elemento specifico in caso di interruzione del processo. Per ogni elemento del repository, esegui questi passaggi nel metodo getIds()
:
- Recupera l'ID di ogni elemento e il valore hash associato dal repository.
- Raggruppa ogni coppia di ID e valore hash in un
PushItems
. - Combina ogni
PushItems
in un iteratore restituito dal metodogetIds()
. Tieni presente chegetIds()
restituisce in realtà unCheckpointCloseableIterable
che è un'iterazione diApiOperation
oggetti, ognuno dei quali rappresenta una richiesta API eseguita su unRepositoryDoc
, ad esempio l'inserimento degli elementi nella coda.
Il seguente snippet di codice mostra come ottenere l'ID e il valore hash di ogni elemento e
inserirli in un
PushItems
. Un PushItems
è una
richiesta ApiOperation
per inserire un elemento nella coda di indicizzazione di Cloud Search.
Il seguente snippet di codice mostra come utilizzare la classe
PushItems.Builder
per raggruppare gli ID e i valori hash in un unico push
ApiOperation
.
Gli elementi vengono inseriti nella coda di indicizzazione di Cloud Search per l'ulteriore elaborazione.
Recuperare e gestire ogni elemento
Esegui l'override di
getDoc()
per gestire ogni elemento nella coda di indicizzazione di Cloud Search.
Un elemento può essere nuovo, modificato, invariato o non esistere più nel repository di origine. Recupera e indicizza ogni elemento nuovo o modificato. Rimuovi gli elementi
dall'indice che non esistono più nel repository di origine.
Il metodo getDoc()
accetta un elemento dalla coda di indicizzazione di Cloud Search. Per ogni elemento della coda, esegui questi passaggi nel metodo
getDoc()
:
Controlla se l'ID dell'elemento, all'interno della coda di indicizzazione di Cloud Search, esiste nel repository. In caso contrario, elimina l'elemento dall'indice. Se l'elemento esiste, vai al passaggio successivo.
Indice modificato o nuovi elementi:
- Imposta le autorizzazioni.
- Imposta i metadati per l'elemento che stai indicizzando.
- Combina i metadati e l'elemento in un
RepositoryDoc
indicizzabile. - Inserisci gli ID secondari nella coda di indicizzazione di Cloud Search per l'ulteriore elaborazione.
- Restituisci
RepositoryDoc
.
Gestire gli elementi eliminati
Il seguente snippet di codice mostra come determinare se un elemento esiste nell'indice e, in caso contrario, eliminarlo.
Impostare le autorizzazioni per un elemento
Il repository utilizza un elenco di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi che hanno accesso a un elemento. Un ACL è un elenco di ID per gruppi o utenti che possono accedere all'elemento.
Devi duplicare la ACL utilizzata dal repository per assicurarti che solo gli utenti con accesso a un elemento possano visualizzarlo in un risultato di ricerca. L'elenco di controllo degli accessi per un elemento deve essere incluso durante l'indicizzazione di un elemento in modo che Google Cloud Search disponga delle informazioni necessarie per fornire il livello di accesso corretto all'elemento.
L'SDK Content Connector fornisce un ricco insieme di classi e metodi ACL per modellare gli ACL della maggior parte dei repository. Devi analizzare la ACL per ogni elemento del repository e creare una ACL corrispondente per Google Cloud Search quando indicizzi un elemento. Se l'ACL del repository utilizza concetti come l'ereditarietà dell'ACL, la modellazione dell'ACL può essere complicata. Per ulteriori informazioni sugli ACL di Google Cloud Search, consulta ACL di Google Cloud Search.
Nota:l'API Cloud Search Indexing supporta gli elenchi di controllo dell'accesso (ACL) per un singolo dominio. Non supporta
le ACL cross-domain. Utilizza la classe
Acl.Builder
per impostare l'accesso a ogni elemento utilizzando un ACL. Lo snippet di codice riportato di seguito, tratto dall'esempio di attraversamento completo, consente a tutti gli utenti o "principali" (getCustomerPrincipal()
) di essere "lettori" di tutti gli elementi (.setReaders()
) durante l'esecuzione di una ricerca.
Devi comprendere gli ACL per modellarli correttamente per il repository. Ad esempio, potresti indicizzare file all'interno di un file system che utilizza un modello di ereditarietà in base al quale le cartelle secondarie ereditano le autorizzazioni dalle cartelle principali. La modellazione dell'ereditarietà degli ACL richiede informazioni aggiuntive trattate in ACL di Google Cloud Search
Impostare i metadati per un elemento
I metadati vengono archiviati in un oggetto Item
. Per creare un Item
, devi disporre
almeno di un ID stringa univoco, un tipo di elemento, un ACL, un URL e una versione per l'elemento.
Il seguente snippet di codice mostra come creare un Item
utilizzando la classe helper
IndexingItemBuilder
.
Crea l'elemento indicizzabile
Una volta impostati i metadati per l'elemento, puoi creare l'elemento
indicizzabile effettivo utilizzando
RepositoryDoc.Builder
.
Il seguente esempio mostra come creare un singolo elemento indicizzabile.
Un RepositoryDoc
è un tipo di ApiOperation
che esegue la richiesta IndexingService.indexItem()
effettiva.
Puoi anche utilizzare il metodo
setRequestMode()
della classe
RepositoryDoc.Builder
per identificare la richiesta di indicizzazione come ASYNCHRONOUS
o SYNCHRONOUS
:
ASYNCHRONOUS
- La modalità asincrona comporta una latenza più lunga dall'indicizzazione alla pubblicazione e consente una quota di throughput elevata per le richieste di indicizzazione. La modalità asincrona è consigliata per l'indicizzazione iniziale (backfill) dell'intero repository.
SYNCHRONOUS
- La modalità sincrona comporta una latenza di indicizzazione e pubblicazione più breve e
consente di gestire una quota di velocità effettiva limitata. La modalità sincrona è
consigliata per l'indicizzazione di aggiornamenti e modifiche al repository. Se
non specificata, la modalità di richiesta predefinita è
SYNCHRONOUS
.
Inserire gli ID secondari 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 di elaborazione. Questi ID vengono elaborati dopo l'indicizzazione dell'elemento principale.
Passaggi successivi
Ecco alcuni passaggi successivi che puoi intraprendere:
- (Facoltativo) Implementa il metodo
close()
per rilasciare le risorse prima dell'arresto. - (facoltativo) Crea un connettore di identità utilizzando l'SDK Identity Connector.
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
La funzione principale di un connettore di contenuti è attraversare un repository e indicizzare i relativi dati. Devi implementare una strategia di attraversamento basata sulle dimensioni e sul layout dei dati nel repository. Di seguito sono riportate tre strategie di attraversamento comuni:
- Strategia di attraversamento completo
Una strategia di attraversamento completo esamina l'intero repository e indicizza ciecamente ogni elemento. Questa strategia viene comunemente utilizzata quando hai un repository di piccole dimensioni e puoi permetterti l'overhead di eseguire un attraversamento completo ogni volta che esegui l'indicizzazione.
Questa strategia di attraversamento è adatta a repository di piccole dimensioni con dati per lo più 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 degli elenchi
Una strategia di attraversamento dell'elenco esamina l'intero repository, inclusi tutti i nodi secondari, determinando lo stato di ogni elemento. Successivamente, il connettore esegue una seconda passata e indicizza solo gli elementi nuovi o aggiornati dall'ultima indicizzazione. Questa strategia viene comunemente utilizzata per eseguire aggiornamenti incrementali a un indice esistente (invece di dover eseguire un attraversamento completo ogni volta che aggiorni l'indice).
Questa strategia di attraversamento è adatta quando il rilevamento delle modifiche è difficile o non supportato dal repository, quando hai dati non gerarchici e quando lavori con set di dati molto grandi.
- Attraversamento del grafico
Una strategia di attraversamento del grafico esamina l'intero nodo principale determinando lo stato di ogni elemento. Successivamente, il connettore esegue una seconda passata e indicizza solo gli elementi nel nodo radice che sono nuovi o sono stati aggiornati dall'ultima indicizzazione. Infine, il connettore passa tutti gli ID secondari e poi indicizza gli elementi nei nodi secondari che sono nuovi o sono stati aggiornati. Il connettore continua in modo ricorsivo in tutti i nodi secondari finché non sono stati gestiti tutti gli elementi. Questo attraversamento viene in genere utilizzato per i repository gerarchici in cui l'elenco di tutti gli ID non è pratico.
Questa strategia è adatta se hai dati gerarchici che devono essere scansionati, ad esempio una serie di directory o pagine web.
Implementare la strategia di attraversamento e indicizzare gli elementi
Ogni elemento indicizzabile per Cloud Search viene definito elemento nell'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 popolare l'indice:
(Facoltativo) Utilizzo di
items.upload
per caricare file di dimensioni superiori a 100 KiB per l'indicizzazione. Per i file più piccoli, incorpora i contenuti come inlineContent utilizzandoitems.index
.(facoltativo) Utilizzo di
media.upload
per caricare i file multimediali per l'indicizzazione.Utilizzo di
items.index
per indicizzare l'elemento. Ad esempio, se lo schema utilizza la definizione dell'oggetto nello schema movie, una richiesta di indicizzazione per un singolo elemento 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" }
(Facoltativo) Utilizza le chiamate items.get per verificare che un articolo sia stato indicizzato.
Per eseguire un attraversamento completo, devi reindicizzare periodicamente l'intero repository. Per eseguire l'attraversamento di un elenco o di un grafico, devi implementare il codice per gestire le modifiche al repository.
Gestire le modifiche al repository
Puoi raccogliere e indicizzare periodicamente ogni elemento di un repository per eseguire un'indicizzazione completa. Sebbene efficace per garantire che l'indice sia aggiornato, l'indicizzazione completa può essere costosa quando si ha a che fare con repository più grandi o gerarchici.
Anziché utilizzare le chiamate di indicizzazione per indicizzare un intero repository di tanto in tanto, puoi anche utilizzare la coda di indicizzazione di Google Cloud come meccanismo per monitorare le modifiche e indicizzare solo gli elementi modificati. Puoi utilizzare le richieste items.push per inserire gli elementi nella coda per il successivo polling e aggiornamento. Per ulteriori informazioni sulla coda di indicizzazione di Google Cloud, consulta Coda di indicizzazione di Google Cloud.
Per ulteriori informazioni sull'API Google Cloud Search, consulta la pagina API Cloud Search.