Un connettore di contenuti è un programma software che attraversa i dati in un repository aziendale e compila un'origine dati. Google offre le seguenti opzioni per lo sviluppo di connettori di contenuti:
L'SDK Content Connector. Questa è una buona opzione per i programmatori Java. L'SDK è un wrapper intorno 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 utilizzi 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 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. Le notifiche di modifica vengono convertite in richieste di indicizzazione per mantenere sincronizzata l'origine dati di Cloud Search. Il connettore esegue questa attività solo se il repository supporta il rilevamento delle modifiche.
Crea un connettore di contenuti utilizzando l'SDK Content Connector
Le sezioni seguenti spiegano come creare un connettore di contenuti utilizzando Content Connector SDK.
Configurare le dipendenze
Includi queste dipendenze nel file di build.
Maven
xml
<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-indexing-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>
Gradle
groovy
compile group: 'com.google.enterprise.cloudsearch',
name: 'google-cloudsearch-indexing-connector-sdk',
version: 'v1-0.0.3'
Crea la configurazione del connettore
Ogni connettore utilizza un file di configurazione per parametri come l'ID repository.
Definisci i parametri come coppie chiave-valore, ad esempio
api.sourceId=1234567890abcdef.
Google Cloud Search SDK include parametri forniti da Google per tutti i connettori. Devi dichiarare quanto segue nel file di configurazione:
- Connettore di contenuti: dichiara
api.sourceIdeapi.serviceAccountPrivateKeyFile. Questi identificano il tuo repository e la chiave privata necessaria per l'accesso.
- Connettore di identità: dichiara
api.identitySourceIdper identificare l'origine identità esterna. Per la sincronizzazione degli utenti, dichiara ancheapi.customerId(l'ID univoco del tuo account Google Workspace).
Dichiara altri parametri forniti da Google solo per eseguire l'override dei valori predefiniti. Per informazioni dettagliate sulla generazione di ID e chiavi, vedi Parametri forniti da Google.
Puoi anche definire parametri specifici per il repository nel file di configurazione.
Trasferisci il file di configurazione al connettore
Imposta la proprietà di sistema config per passare il file di configurazione. Utilizza l'argomento -D
quando avvii il connettore. Ad esempio:
java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector
Se ometti questo argomento, l'SDK tenta di utilizzare un file denominato
connector-config.properties nella directory locale.
Determinare la strategia di attraversamento
La funzione principale di un connettore di contenuti è attraversare un repository e indicizzare i relativi dati. Devi implementare una strategia in base alle dimensioni e al layout del repository. Puoi progettare la tua strategia o sceglierne una dall'SDK:
- Strategia di attraversamento completo
- Scansiona l'intero repository e indicizza ogni elemento. Questa strategia è ideale per repository di piccole dimensioni in cui puoi permetterti l'overhead di un attraversamento completo durante ogni indicizzazione. Utilizzalo per repository di piccole dimensioni con dati per lo più statici e non gerarchici oppure quando il rilevamento delle modifiche è difficile.
- Strategia di attraversamento degli elenchi
- Esegue la scansione dell'intero repository per determinare lo stato di ogni elemento, quindi indicizza solo gli elementi nuovi o aggiornati. Utilizzalo per gli aggiornamenti incrementali di un indice di grandi dimensioni e non gerarchico quando il rilevamento delle modifiche non è supportato.
- Attraversamento del grafico
- Esegue la scansione di un nodo principale per determinare lo stato dei relativi elementi, quindi indicizza gli elementi nuovi o aggiornati nel nodo. Quindi, elabora in modo ricorsivo i nodi secondari. Utilizza questo formato per i repository gerarchici in cui elencare tutti gli ID non è pratico, ad esempio strutture di directory o siti web.
L'SDK implementa queste strategie nelle classi dei connettori dei modelli. Questi modelli possono accelerare lo sviluppo. Per utilizzare un modello, consulta la sezione corrispondente:
- Creare un connettore di attraversamento completo utilizzando una classe modello
- Creare un connettore di attraversamento di elenchi utilizzando una classe modello
- Crea un connettore di attraversamento del grafico utilizzando una classe modello
Creare un connettore di attraversamento completo utilizzando una classe modello
Questa sezione fa riferimento al codice di FullTraversalSample.
Implementa il punto di ingresso del connettore
L'entry point è il metodo main(). Crea un'istanza di
Application
e chiama
start()
per eseguire il connettore.
Prima di chiamare application.start(), utilizza la
classe IndexingApplication.Builder
per creare un'istanza del
modello FullTraversalConnector. Questo modello accetta un oggetto
Repository.
L'SDK chiama initConfig() dopo le chiamate al metodo main()
Application.build(). Il metodo initConfig():
- Garantisce che
Configurationnon sia già inizializzato. - Inizializza l'oggetto
Configurationcon le coppie chiave-valore fornite da Google.
Implementa l'interfaccia Repository
L'oggetto Repository attraversa e indicizza gli elementi del repository. Quando utilizzi un
modello, devi sostituire solo determinati metodi nell'interfaccia Repository. Per FullTraversalConnector, sostituzione:
init(): Per la configurazione e l'inizializzazione del repository.getAllDocs(): Per attraversare e indicizzare tutti gli elementi. Viene chiamato una volta per ogni attraversamento pianificato.- (Facoltativo)
getChanges(): se il repository supporta il rilevamento delle modifiche, esegui l'override di questa impostazione per recuperare e indicizzare gli elementi modificati. - (Facoltativo)
close(): Per la pulizia del repository durante l'arresto.
Ogni metodo restituisce un oggetto
ApiOperation, che esegue l'indicizzazione utilizzando IndexingService.indexItem().
Ottenere parametri di configurazione personalizzati
Per gestire la configurazione del connettore, devi recuperare tutti i parametri personalizzati dall'oggetto
Configuration. Esegui questa attività nel metodo
Repository
della classe
init().
La classe Configuration include metodi per recuperare diversi tipi di dati.
Ogni metodo restituisce un oggetto ConfigValue. Utilizza il metodo
get()
dell'oggetto ConfigValue per recuperare il valore. Questo snippet di
FullTraversalSample
mostra come recuperare un valore intero personalizzato:
Per recuperare e analizzare i parametri con più valori, utilizza uno dei
parser di tipo della classe Configuration. Questo snippet del connettore del tutorial
utilizza
getMultiValue
per recuperare un elenco di nomi di repository GitHub:
Eseguire un'attraversamento completo
Esegui l'override di getAllDocs() per eseguire un attraversamento completo. Questo metodo accetta un
checkpoint per riprendere l'indicizzazione in caso di interruzione. Per ogni elemento:
- Imposta le autorizzazioni.
- Imposta i metadati.
- Combinali in un
RepositoryDoc. - Inserisci ogni elemento nel pacchetto dell'iteratore restituito da
getAllDocs().
Se il set di elementi è troppo grande per una sola chiamata, utilizza un checkpoint e chiama
hasMore(true).
Impostare le autorizzazioni per un elemento
I repository utilizzano gli elenchi di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi con accesso a un elemento. Una ACL elenca gli ID di utenti o gruppi autorizzati.
Per garantire che gli utenti vedano solo i risultati di ricerca a cui sono autorizzati ad accedere, devi replicare gli ACL del repository. Includi l'ACL durante l'indicizzazione di un elemento in modo che Google Cloud Search possa fornire il livello di accesso corretto.
L'SDK Content Connector include classi e metodi per modellare le ACL della maggior parte dei repository. Analizza gli elenchi di controllo degli accessi del repository e crea gli elenchi di controllo degli accessi corrispondenti per Cloud Search durante l'indicizzazione. La modellazione di ACL complesse, come quelle che utilizzano l'ereditarietà, richiede un'attenta pianificazione. Per saperne di più, consulta la pagina ACL di Cloud Search.
Utilizza la classe
Acl.Builder
per impostare l'accesso. Questo snippet dell'esempio di attraversamento completo consente a tutti
gli utenti del dominio (getCustomerPrincipal())
di leggere tutti gli elementi (setReaders()):
La modellazione corretta degli ACL del repository, in particolare quelli che utilizzano modelli di ereditarietà, richiede le informazioni contenute in ACL di Cloud Search.
Impostare i metadati per un elemento
I metadati vengono archiviati in un oggetto Item. Per creare un Item, devi disporre di un ID, un tipo di elemento, un ACL, un URL e una versione unici. Utilizza la classe helper
IndexingItemBuilder.
Crea l'elemento indicizzabile
Utilizza la classe
RepositoryDoc.Builder.
Un RepositoryDoc è un ApiOperation che esegue la
richiesta IndexingService.indexItem().
Utilizza il metodo
setRequestMode()
della classe RepositoryDoc.Builder per impostare la richiesta di indicizzazione su
ASYNCHRONOUS o SYNCHRONOUS:
ASYNCHRONOUS- Questa modalità ha una latenza di indicizzazione e pubblicazione più lunga, ma offre una quota di throughput maggiore. Utilizza la modalità asincrona per l'indicizzazione iniziale (backfill) di un intero repository.
SYNCHRONOUS- Questa modalità ha una latenza di indicizzazione-erogazione più breve, ma una quota di throughput inferiore. Utilizza la modalità sincrona per indicizzare gli aggiornamenti e le modifiche del repository. Se non specificata, la modalità di richiesta è
SYNCHRONOUSper impostazione predefinita.
Inserisci ogni elemento indicizzabile in un iteratore
Il metodo getAllDocs() restituisce un
CheckpointCloseableIterable
di oggetti RepositoryDoc. Utilizza la classe
CheckpointCloseableIterableImpl.Builder.
Passaggi successivi
- (Facoltativo) Se la velocità effettiva di indicizzazione è bassa, consulta Aumentare la velocità di indicizzazione.
- (Facoltativo) Implementa
close()per rilasciare le risorse. - (Facoltativo) Crea un connettore di identità.
Crea un connettore di attraversamento di elenchi utilizzando una classe modello
La coda di indicizzazione di Cloud Search contiene ID e hash facoltativi per gli elementi del repository. Un connettore di attraversamento di elenchi inserisce gli ID in questa coda e li recupera per l'indicizzazione. Cloud Search gestisce queste code per determinare lo stato degli elementi, ad esempio le eliminazioni. Consulta La coda di indicizzazione di Cloud Search.
Questa sezione si riferisce a ListTraversalSample.
Implementa il punto di ingresso del connettore
Il metodo main() crea un'istanza Application e chiama start(). Utilizza
IndexingApplication.Builder per creare un'istanza del
modello
ListingConnector.
Implementa l'interfaccia Repository
Esegui l'override dei seguenti metodi per ListingConnector:
init(): Per la configurazione del repository.getIds(): Per recuperare ID e hash per tutti i record.getDoc(): Per aggiungere, aggiornare o eliminare elementi dall'indice.- (Facoltativo)
getChanges(): per aggiornamenti incrementali utilizzando il rilevamento delle modifiche. - (Facoltativo)
close(): per la pulizia del repository.
Eseguire l'attraversamento della lista
Esegui l'override di getIds() per recuperare ID e hash. Esegui l'override di getDoc() per gestire
ogni elemento nella coda di indicizzazione di Cloud Search.
Invio di ID articolo e valori hash
Esegui l'override di getIds() per recuperare ID e hash dei contenuti. Raggruppali in una richiesta PushItems alla coda di indicizzazione.
Utilizza PushItems.Builder per raggruppare gli ID e gli hash.
Recuperare e gestire ogni elemento
Esegui l'override di getDoc() per gestire gli elementi nella coda di indicizzazione. Gli elementi possono essere nuovi,
modificati, invariati o eliminati.
- Controlla se l'ID articolo esiste nel repository. In caso contrario, eliminalo.
- Esegui il polling dell'indice per lo stato. Se non è stato modificato (
ACCEPTED), non fare nulla. - Elementi nuovi o modificati dell'indice: imposta le autorizzazioni, imposta i metadati, combinali in un
RepositoryDoce restituiscili.
Gestire gli elementi eliminati
Questo snippet mostra come determinare se un elemento esiste ed eliminarlo in caso contrario.
Gestire gli elementi non modificati
Esegui il polling della coda di indicizzazione per gestire gli elementi invariati.
L'esempio utilizza un hash per rilevare le modifiche.
Impostare le autorizzazioni per un elemento
I repository utilizzano gli elenchi di controllo dell'accesso (ACL) per identificare gli utenti o i gruppi con accesso a un elemento. Una ACL elenca gli ID di utenti o gruppi autorizzati.
Per garantire che gli utenti vedano solo i risultati di ricerca a cui sono autorizzati ad accedere, devi replicare gli ACL del repository. Includi l'ACL durante l'indicizzazione di un elemento in modo che Google Cloud Search possa fornire il livello di accesso corretto.
L'SDK Content Connector include classi e metodi per modellare le ACL della maggior parte dei repository. Analizza gli elenchi di controllo degli accessi del repository e crea gli elenchi di controllo degli accessi corrispondenti per Cloud Search durante l'indicizzazione. La modellazione di ACL complesse, come quelle che utilizzano l'ereditarietà, richiede un'attenta pianificazione. Per saperne di più, consulta la pagina ACL di Cloud Search.
Utilizza la classe
Acl.Builder
per impostare l'accesso. Questo snippet dell'esempio di attraversamento completo consente a tutti
gli utenti del dominio (getCustomerPrincipal())
di leggere tutti gli elementi (setReaders()):
La modellazione corretta degli ACL del repository, in particolare quelli che utilizzano modelli di ereditarietà, richiede le informazioni contenute in ACL di Cloud Search.
Impostare i metadati per un elemento
Creare un elemento indicizzabile
Utilizza il metodo
setRequestMode()
della classe RepositoryDoc.Builder per impostare la richiesta di indicizzazione su
ASYNCHRONOUS o SYNCHRONOUS:
ASYNCHRONOUS- Questa modalità ha una latenza di indicizzazione e pubblicazione più lunga, ma offre una quota di throughput maggiore. Utilizza la modalità asincrona per l'indicizzazione iniziale (backfill) di un intero repository.
SYNCHRONOUS- Questa modalità ha una latenza di indicizzazione-erogazione più breve, ma una quota di throughput inferiore. Utilizza la modalità sincrona per indicizzare gli aggiornamenti e le modifiche del repository. Se non specificata, la modalità di richiesta è
SYNCHRONOUSper impostazione predefinita.
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.
Crea un connettore di attraversamento del grafico utilizzando una classe modello
La coda di indicizzazione di Cloud Search contiene ID e valori hash facoltativi per ogni elemento del repository. Un connettore di attraversamento del grafico inserisce gli ID elemento nella coda di indicizzazione di Google Cloud Search e li recupera uno alla volta per l'indicizzazione. Google Cloud Search gestisce le code e confronta i contenuti delle code per determinare lo stato degli elementi, ad esempio se un elemento è stato eliminato dal repository. Per saperne di più sulla coda di indicizzazione di Cloud Search, consulta La coda di indicizzazione di Google Cloud Search.
Durante l'indicizzazione, i contenuti dell'articolo vengono recuperati dal repository di dati e gli ID articolo secondari vengono inseriti nella coda. Il connettore elabora in modo ricorsivo gli ID principali e secondari finché non vengono gestiti tutti gli elementi.
Implementa il punto di ingresso del connettore
Il punto di ingresso di un connettore è il metodo
main(). Questo metodo crea un'istanza della classe
Application e chiama il relativo metodo
start() per eseguire il connettore.
Prima di chiamare
application.start(),
utilizza la classe
IndexingApplication.Builder
per creare un'istanza del modello ListingConnector. ListingConnector
accetta un
oggetto
Repository
i cui metodi implementi.
Implementa l'interfaccia Repository
Esegui l'override di init(), getIds(), getDoc() e, facoltativamente, di getChanges() o
close().
Esegui l'attraversamento del grafico
Esegui l'override di getIds() per recuperare gli ID iniziali e di getDoc() per gestire gli elementi e
inserire gli ID secondari nella coda.
Invio di ID articolo e valori hash
Recuperare e gestire ogni elemento
- Controlla se l'ID esiste nel repository. In caso contrario, elimina l'elemento.
- Per gli elementi esistenti, imposta le autorizzazioni e i metadati e combinali in un
RepositoryDoc. - Trasferisci gli ID secondari alla coda di indicizzazione.
- Restituisci
RepositoryDoc.
Gestire gli elementi eliminati
Imposta i metadati e crea l'elemento
Inserisci gli ID secondari nella coda di indicizzazione
Crea un connettore di contenuti utilizzando l'API REST
Le sezioni seguenti spiegano come creare un connettore di contenuti utilizzando l'API REST.
Determinare la strategia di attraversamento
Le strategie (completa, elenco e grafico) sono concettualmente le stesse dell'SDK. Implementa la strategia scelta utilizzando l'API REST.
Implementare la strategia di attraversamento e indicizzare gli elementi
Registra lo schema, quindi compila l'indice utilizzando:
- (Facoltativo)
items.uploadper i file più grandi di 100 KiB. - (Facoltativo)
media.uploadper i file multimediali. items.indexper indicizzare l'elemento.Esempio di richiesta di indicizzazione:
{ "name": "datasource/<data_source_id>/items/titanic", "acl": { "readers": [ { "gsuitePrincipal": { "gsuiteDomain": true } } ] }, "metadata": { "title": "Titanic", "viewUrl": "http://www.imdb.com/title/tt2234155/", "objectType": "movie" }, "structuredData": { "object": { "properties": [ { "name": "movieTitle", "textValues": { "values": ["Titanic"] } } ] } }, "content": { "inlineContent": "A seventeen-year-old aristocrat falls in love...", "contentFormat": "TEXT" }, "version": "01", "itemType": "CONTENT_ITEM" }(Facoltativo) Utilizza
items.getper verificare l'indicizzazione.
Gestire le modifiche al repository
Esegui periodicamente la reindicizzazione dell'intero repository per l'indicizzazione completa. Per l'attraversamento di elenchi o grafici, utilizza la coda di indicizzazione di Google Cloud per monitorare le modifiche e indicizzare solo ciò che è cambiato. Usa items.push per aggiungere elementi
alla coda.