Un connecteur de contenu est un logiciel qui parcourt les données d'un dépôt d'entreprise et alimente une source de données. Google propose les options suivantes pour développer des connecteurs de contenu :
Le SDK Content Connector. Cette option est idéale pour les programmeurs Java. Le SDK est un wrapper pour l'API REST qui accélère la création des connecteurs. Pour créer un connecteur de contenu à l'aide du SDK, consultez Créer un connecteur de contenu à l'aide du SDK Content Connector.
Une API REST de bas niveau ou des bibliothèques d'API. Préférez ces options si vous n'utilisez pas Java, ou si votre base de code est mieux adaptée à une API REST ou à une bibliothèque. Pour créer un connecteur de contenu à l'aide de l'API REST, consultez Créer un connecteur de contenu à l'aide de l'API REST.
Un connecteur de contenu standard exécute les tâches suivantes :
- Lecture et traitement des paramètres de configuration
- Extraction de fragments distincts de données indexables, appelées éléments, à partir du dépôt tiers
- Combinaison des listes de contrôle d'accès (LCA), des métadonnées et des contenus dans les éléments indexables
- Indexe les éléments dans la source de données Cloud Search.
- (Facultatif) Écoute les notifications de modification en provenance du dépôt. Les notifications de modification sont converties en requêtes d'indexation pour que la source de données Cloud Search reste synchronisée. Le connecteur exécute cette tâche à condition que le dépôt autorise la détection des modifications.
Créer un connecteur de contenu à l'aide du SDK Content Connector
Les sections suivantes expliquent comment créer un connecteur de contenu à l'aide du SDK Content Connector.
Configurer des dépendances
Incluez ces dépendances dans votre fichier de compilation.
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'
Créer la configuration de votre connecteur
Chaque connecteur utilise un fichier de configuration pour les paramètres tels que l'ID de votre dépôt.
Définissez les paramètres sous forme de paires clé-valeur, comme api.sourceId=1234567890abcdef.
Le SDK Google Cloud Search inclut des paramètres fournis par Google pour tous les connecteurs. Vous devez déclarer les éléments suivants dans votre fichier de configuration :
- Connecteur de contenu : déclarez
api.sourceIdetapi.serviceAccountPrivateKeyFile. Ils identifient votre dépôt et la clé privée nécessaire pour y accéder.
- Connecteur d'identité : déclarez
api.identitySourceIdpour identifier votre source d'identité externe. Pour la synchronisation des utilisateurs, déclarez égalementapi.customerId(l'ID unique de votre compte Google Workspace).
Déclarez les autres paramètres fournis par Google uniquement pour remplacer leurs valeurs par défaut. Pour savoir comment générer des ID et des clés, consultez Paramètres fournis par Google.
Vous pouvez également définir des paramètres propres au dépôt dans votre fichier de configuration.
Transmettre le fichier de configuration au connecteur
Définissez la propriété système config pour transmettre le fichier de configuration. Utilisez l'argument -D lorsque vous démarrez le connecteur. Exemple :
java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector
Si vous omettez cet argument, le SDK tente d'utiliser un fichier nommé connector-config.properties dans le répertoire local.
Déterminer votre stratégie de balayage
La fonction principale d'un connecteur de contenu consiste à parcourir un dépôt et à en indexer les données. Vous devez mettre en place une stratégie basée sur la taille et la disposition de votre dépôt. Vous pouvez concevoir votre propre stratégie ou en choisir une dans le SDK :
- Stratégie de balayage complet
- Analyse l'intégralité du dépôt et indexe chaque élément. Cette stratégie est optimale pour les petits dépôts où vous pouvez vous permettre la surcharge d'un parcours complet lors de chaque indexation. Utilisez-la pour les petits dépôts contenant principalement des données statiques non hiérarchisées, ou lorsque la détection des modifications est difficile.
- Stratégie de balayage de liste
- : analyse l'intégralité du dépôt pour déterminer l'état de chaque élément, puis indexe uniquement les éléments nouveaux ou modifiés. Utilisez cette méthode pour les mises à jour incrémentielles d'un grand index non hiérarchique lorsque la détection des modifications n'est pas prise en charge.
- Parcours de graphe
- Analyse un nœud parent pour déterminer l'état de ses éléments, puis indexe les éléments nouveaux ou modifiés de ce nœud. Il traite ensuite les nœuds enfants de manière récursive. Utilisez cette stratégie pour les dépôts hiérarchiques pour lesquels il est difficile d'établir une liste exhaustive des ID, comme les structures de répertoires ou les sites Web.
Le SDK implémente ces stratégies dans des classes de connecteur de modèle. Ces modèles peuvent accélérer votre développement. Pour utiliser un modèle, consultez la section correspondante :
- Créer un connecteur de balayage complet à partir d'un modèle de classe
- Créer un connecteur de balayage de liste à partir d'un modèle de classe
- Créer un connecteur de balayage de graphe à partir d'un modèle de classe
Créer un connecteur de balayage complet à partir d'un modèle de classe
Cette section fait référence au code de l'exemple FullTraversalSample.
Ajouter le point d'entrée du connecteur
Le point d'entrée est la méthode main(). Il crée une instance Application et appelle start() pour exécuter le connecteur.
Avant d'appeler application.start(), utilisez la classe IndexingApplication.Builder pour instancier le modèle FullTraversalConnector. Ce modèle accepte un objet Repository.
Le SDK appelle initConfig() après que votre méthode main() a appelé Application.build(). La méthode initConfig() :
- S'assure que
Configurationn'est pas déjà initialisé. - Initialise l'objet
Configurationavec les paires clé/valeur fournies par Google.
Implémenter l'interface Repository
L'objet Repository parcourt et indexe les éléments du dépôt. Lorsque vous utilisez un modèle, il vous suffit de remplacer certaines méthodes dans l'interface Repository. Pour FullTraversalConnector, remplacez :
init(): pour la configuration et l'initialisation du dépôt.getAllDocs(): pour parcourir et indexer tous les éléments. Celle-ci est appelée une fois pour chaque balayage planifié.- (Facultatif)
getChanges(): si votre dépôt accepte la détection des modifications, remplacez cette méthode pour récupérer et indexer les éléments modifiés. - (Facultatif)
close(): pour le nettoyage du dépôt lors de l'arrêt.
Chaque méthode renvoie un objet ApiOperation, qui effectue l'indexation à l'aide de IndexingService.indexItem().
Récupérer les paramètres de configuration personnalisés
Pour gérer la configuration de votre connecteur, vous devez récupérer les éventuels paramètres personnalisés contenus dans l'objet Configuration. Effectuez cette tâche dans la méthode init() de la classe Repository.
La classe Configuration inclut des méthodes permettant de récupérer différents types de données.
Chaque méthode renvoie un objet ConfigValue. Utilisez la méthode get() de l'objet ConfigValue pour récupérer la valeur. Cet extrait de code issu de FullTraversalSample montre comment récupérer une valeur entière personnalisée :
Pour récupérer et analyser des paramètres comportant plusieurs valeurs, utilisez l'un des analyseurs de type de la classe Configuration. Cet extrait du connecteur du tutoriel utilise
getMultiValue
pour récupérer la liste des noms de dépôts GitHub :
Effectuer un balayage complet
Remplacez getAllDocs() pour effectuer un balayage complet. Cette méthode accepte un point de contrôle pour reprendre l'indexation en cas d'interruption. Pour chaque élément :
- Définissez les autorisations.
- Définissez les métadonnées.
- Combinez-les dans un
RepositoryDoc. - Empaquetez chaque élément dans l'itérateur renvoyé par
getAllDocs().
Si l'ensemble d'éléments est trop volumineux pour un seul appel, utilisez un point de contrôle et appelez hasMore(true).
Définir les autorisations pour un élément
Les dépôts utilisent des listes de contrôle d'accès (LCA) pour identifier les utilisateurs ou les groupes ayant accès à un élément. Une LCA liste les ID des utilisateurs ou groupes autorisés.
Pour vous assurer que les utilisateurs ne voient que les résultats de recherche auxquels ils sont autorisés à accéder, vous devez répliquer les LCA de votre dépôt. Incluez la LCA lors de l'indexation d'un élément afin que Google Cloud Search puisse fournir le niveau d'accès approprié.
Le SDK Content Connector inclut des classes et des méthodes permettant de modéliser les LCA de la plupart des dépôts. Analysez les LCA de votre dépôt et créez des LCA correspondantes pour Cloud Search lors de l'indexation. La modélisation des LCA complexes, comme celles qui utilisent l'héritage, nécessite une planification minutieuse. Pour en savoir plus, consultez LCA Cloud Search.
Utilisez la classe
Acl.Builder
pour définir l'accès. Cet extrait de l'exemple de parcours complet permet à tous les utilisateurs du domaine (getCustomerPrincipal()) de lire tous les éléments (setReaders()) :
Pour modéliser correctement les LCA de dépôt, en particulier ceux qui utilisent des modèles d'héritage, vous devez consulter les informations sur les LCA de Cloud Search.
Définir les métadonnées d'un élément
Les métadonnées sont stockées dans un objet Item. La création d'un Item nécessite un ID unique, un type d'élément, une LCA, une URL et une version. Utilisez la classe d'assistance IndexingItemBuilder.
Créer l'élément indexable
Utilisez la classe RepositoryDoc.Builder.
Un RepositoryDoc est un ApiOperation qui exécute la requête IndexingService.indexItem().
Utilisez la méthode setRequestMode() de la classe RepositoryDoc.Builder pour définir la requête d'indexation sur ASYNCHRONOUS ou SYNCHRONOUS :
ASYNCHRONOUS- Ce mode présente une latence plus longue entre l'indexation et la diffusion, mais autorise un quota de débit plus important. Utilisez le mode asynchrone pour l'indexation initiale (remplissage) d'un dépôt entier.
SYNCHRONOUS- Ce mode présente une latence plus courte entre l'indexation et la diffusion, mais un quota de débit plus faible. Utilisez le mode synchrone pour indexer les mises à jour et les modifications apportées au dépôt. Si vous n'indiquez pas de mode de requête, la valeur
SYNCHRONOUSest attribuée par défaut.
Empaqueter chaque élément indexable dans un itérateur
La méthode getAllDocs() renvoie un CheckpointCloseableIterable d'objets RepositoryDoc. Utilisez la classe CheckpointCloseableIterableImpl.Builder.
Étapes suivantes
- (Facultatif) Si le débit d'indexation est lent, consultez Augmenter le taux d'indexation.
- (Facultatif) Implémentez
close()pour libérer les ressources. - (Facultatif) Créez un connecteur d'identité.
Créer un connecteur de balayage de liste à partir d'un modèle de classe
La file d'attente d'indexation Cloud Search contient les ID et les hachages facultatifs des éléments du dépôt. Un connecteur de balayage de liste place les ID dans cette file d'attente et les récupère pour l'indexation. Cloud Search gère ces files d'attente pour déterminer l'état des éléments (s'ils ont été supprimés, par exemple). Consultez File d'attente d'indexation de Cloud Search.
Cette section fait référence à l'exemple ListTraversalSample.
Ajouter le point d'entrée du connecteur
La méthode main() crée une instance Application et appelle start(). Utilisez IndexingApplication.Builder pour instancier le modèle ListingConnector.
Implémenter l'interface Repository
Remplacez les méthodes suivantes pour ListingConnector :
init(): pour la configuration du dépôt.getIds(): pour récupérer les ID et les hachages de tous les enregistrements.getDoc(): permet d'ajouter, de mettre à jour ou de supprimer des éléments de l'index.- (Facultatif)
getChanges(): pour les mises à jour incrémentielles à l'aide de la détection des modifications. - (Facultatif)
close(): pour le nettoyage du dépôt.
Effectuer un balayage de liste
Remplacez getIds() pour récupérer les ID et les hachages. Remplacez getDoc() pour traiter chaque élément de la file d'attente d'indexation Cloud Search.
Transmettre les ID et valeurs de hachage des éléments
Remplacez getIds() pour récupérer les ID et les hachages de contenu. Regroupez-les dans une requête PushItems à la file d'attente d'indexation.
Utilisez PushItems.Builder pour regrouper les ID et les hachages.
Récupérer et traiter chaque élément
Remplacez getDoc() pour gérer les éléments de la file d'attente d'indexation. Les éléments peuvent être nouveaux, modifiés, inchangés ou supprimés.
- Vérifiez si l'ID de l'élément existe dans le dépôt. Dans le cas contraire, supprimez-le.
- Interrogez l'index pour connaître l'état. Si l'état est
ACCEPTED, ne faites rien. - Pour les éléments d'index nouveaux ou modifiés, définissez les autorisations et les métadonnées, combinez-les dans un
RepositoryDoc, puis renvoyez-le.
Traiter les éléments supprimés
Cet extrait montre comment déterminer si un élément existe et le supprimer s'il n'existe pas.
Traiter les éléments non modifiés
Interrogez la file d'attente d'indexation pour traiter les éléments non modifiés.
L'exemple utilise un hachage pour détecter les modifications.
Définir les autorisations pour un élément
Les dépôts utilisent des listes de contrôle d'accès (LCA) pour identifier les utilisateurs ou les groupes ayant accès à un élément. Une LCA liste les ID des utilisateurs ou groupes autorisés.
Pour vous assurer que les utilisateurs ne voient que les résultats de recherche auxquels ils sont autorisés à accéder, vous devez répliquer les LCA de votre dépôt. Incluez la LCA lors de l'indexation d'un élément afin que Google Cloud Search puisse fournir le niveau d'accès approprié.
Le SDK Content Connector inclut des classes et des méthodes permettant de modéliser les LCA de la plupart des dépôts. Analysez les LCA de votre dépôt et créez des LCA correspondantes pour Cloud Search lors de l'indexation. La modélisation des LCA complexes, comme celles qui utilisent l'héritage, nécessite une planification minutieuse. Pour en savoir plus, consultez LCA Cloud Search.
Utilisez la classe
Acl.Builder
pour définir l'accès. Cet extrait de l'exemple de parcours complet permet à tous les utilisateurs du domaine (getCustomerPrincipal()) de lire tous les éléments (setReaders()) :
Pour modéliser correctement les LCA de dépôt, en particulier ceux qui utilisent des modèles d'héritage, vous devez consulter les informations sur les LCA de Cloud Search.
Définir les métadonnées d'un élément
Créer un élément indexable
Utilisez la méthode setRequestMode() de la classe RepositoryDoc.Builder pour définir la requête d'indexation sur ASYNCHRONOUS ou SYNCHRONOUS :
ASYNCHRONOUS- Ce mode présente une latence plus longue entre l'indexation et la diffusion, mais autorise un quota de débit plus important. Utilisez le mode asynchrone pour l'indexation initiale (remplissage) d'un dépôt entier.
SYNCHRONOUS- Ce mode présente une latence plus courte entre l'indexation et la diffusion, mais un quota de débit plus faible. Utilisez le mode synchrone pour indexer les mises à jour et les modifications apportées au dépôt. Si vous n'indiquez pas de mode de requête, la valeur
SYNCHRONOUSest attribuée par défaut.
Étapes suivantes
Voici quelques étapes que vous pouvez également suivre :
- (Facultatif) Ajoutez la méthode
close()pour libérer les ressources avant l'arrêt du connecteur. - (Facultatif) Créez un connecteur d'identité à l'aide du SDK Content Connector.
Créer un connecteur de balayage de graphe à partir d'un modèle de classe
La file d'attente d'indexation Cloud Search contient les ID et les valeurs de hachage (facultatives) de chaque élément du dépôt. Un connecteur de balayage de graphe place les ID d'élément dans la file d'attente d'indexation Google Cloud Search, puis les récupère un par un en vue d'indexer les éléments. Google Cloud Search gère les files d'attente et compare leur contenu afin de déterminer l'état des éléments (si un élément a été supprimé du dépôt, par exemple). Pour en savoir plus sur la file d'attente d'indexation Cloud Search, consultez File d'attente d'indexation de Google Cloud Search.
Pendant l'indexation, le contenu des éléments est récupéré dans le dépôt de données et les ID des éléments enfants sont placés dans la file d'attente. Le connecteur traite de manière récursive les ID parents et enfants jusqu'à ce que tous les éléments aient été traités.
Implémenter le point d'entrée du connecteur
Le point d'entrée d'un connecteur est la méthode main(). Cette méthode crée une instance de la classe Application et appelle sa méthode start() pour exécuter le connecteur.
Avant d'appeler application.start(), utilisez la classe IndexingApplication.Builder pour instancier le modèle ListingConnector. Le modèle ListingConnector accepte un objet Repository dont vous utiliserez les méthodes.
Implémenter l'interface Repository
Remplacez init(), getIds(), getDoc() et, éventuellement, getChanges() ou close().
Effectuer un balayage de graphe
Remplacez getIds() pour récupérer les ID initiaux et getDoc() pour gérer les éléments et envoyer les ID enfants dans la file d'attente.
Transmettre les ID et valeurs de hachage des éléments
Récupérer et traiter chaque élément
- Vérifiez si l'ID existe dans le dépôt. Si ce n'est pas le cas, supprimez-le.
- Pour les éléments existants, définissez les autorisations et les métadonnées, puis combinez-les dans un
RepositoryDoc. - Transférez les ID enfants vers la file d'attente d'indexation.
- Renvoyez
RepositoryDoc.
Traiter les éléments supprimés
Définir les métadonnées et créer l'élément
Placer les ID des éléments enfants dans la file d'attente d'indexation
Créer un connecteur de contenu à l'aide de l'API REST
Les sections suivantes expliquent comment créer un connecteur de contenu à l'aide de l'API REST.
Déterminer votre stratégie de balayage
Les stratégies (complète, liste et graphique) sont conceptuellement identiques à celles du SDK. Implémentez la stratégie choisie à l'aide de l'API REST.
Déployer votre stratégie de balayage et vos éléments d'index
Enregistrez votre schéma, puis remplissez l'index à l'aide de l'une des méthodes suivantes :
- (Facultatif)
items.uploadpour les fichiers de plus de 100 Kio. - (Facultatif)
media.uploadpour les fichiers multimédias. items.indexpour indexer l'élément.Exemple de demande d'indexation :
{ "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" }(Facultatif) Utilisez
items.getpour vérifier l'indexation.
Gérer les modifications du dépôt
Réindexez régulièrement l'intégralité du dépôt pour une indexation complète. Pour le balayage de liste ou de graphique, utilisez la file d'attente d'indexation Google Cloud pour suivre les modifications et n'indexer que ce qui a changé. Utilisez items.push pour ajouter des éléments à la file d'attente.