Un conector de contenido es un programa de software que desvía los datos en un repositorio empresarial y propaga una fuente de datos. Google brinda las siguientes opciones para desarrollar conectores de contenido:
El SDK de Content Connector Esta es una buena opción para los programadores de Java. El SDK es un wrapper alrededor de la API de REST que te permite crear conectores rápidamente. Para crear un conector de contenido con el SDK, consulta Crea un conector de contenido con el SDK de Content Connector.
Una API de REST de bajo nivel o bibliotecas de API. Usa estas opciones si no usas Java o si tu base de código se adapta mejor a una API de REST o a una biblioteca. Para crear un conector de contenido con la API de REST, consulta Crea un conector de contenido con la API de REST.
Un conector de contenido típico realiza las siguientes tareas:
- Lee y procesa parámetros de configuración.
- Extrae fragmentos discretos de datos indexables, llamados "elementos", del repositorio de terceros.
- Combina LCA, metadatos y datos de contenido en elementos indexables.
- Indexa elementos a la fuente de datos de Cloud Search.
- (Opcional) Presta atención a las notificaciones de cambios del repositorio. Las notificaciones de cambios se convierten en solicitudes de indexación para mantener sincronizada la fuente de datos de Cloud Search. El conector solo realiza esta tarea si el repositorio admite la detección de cambios.
Crea un conector de contenido con el SDK de conector de contenido
En las siguientes secciones, se explica cómo crear un conector de contenido con el SDK de Content Connector.
Configura dependencias
Incluye estas dependencias en tu archivo de compilación.
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 tu configuración del conector
Cada conector usa un archivo de configuración para parámetros como el ID de tu repositorio.
Define los parámetros como pares clave-valor, como api.sourceId=1234567890abcdef.
El SDK de Google Cloud Search incluye parámetros proporcionados por Google para todos los conectores. Debes declarar lo siguiente en tu archivo de configuración:
- Conector de contenido: Declara
api.sourceIdyapi.serviceAccountPrivateKeyFile. Estos identifican tu repositorio y la clave privada necesaria para acceder a él.
- Conector de identidad: Declara
api.identitySourceIdpara identificar tu fuente de identidad externa. Para la sincronización de usuarios, también debes declararapi.customerId(el ID único de tu cuenta de Google Workspace).
Declara otros parámetros proporcionados por Google solo para anular sus valores predeterminados. Para obtener detalles sobre cómo generar IDs y claves, consulta Parámetros proporcionados por Google.
También puedes definir parámetros específicos del repositorio en tu archivo de configuración.
Pasa el archivo de configuración al conector
Establece la propiedad del sistema config para pasar el archivo de configuración. Usa el argumento -D cuando inicies el conector. Por ejemplo:
java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector
Si omites este argumento, el SDK intentará usar un archivo llamado connector-config.properties en el directorio local.
Determina tu estrategia de recorrido
La función primaria de un conector de contenido es recorrer un repositorio y luego indexar sus datos. Debes implementar una estrategia basada en el tamaño y el diseño de tu repositorio. Puedes diseñar tu propia estrategia o elegir una del SDK:
- Estrategia de recorrido completo
- Analiza todo el repositorio y, luego, indexa cada elemento. Esta estrategia es la mejor para los repositorios pequeños en los que puedes permitirte la sobrecarga de un recorrido completo durante cada indexación. Úsala para repositorios pequeños con datos que son, en su mayoría, estáticos y no jerárquicos, o cuando la detección de cambios es difícil.
- Estrategia de recorrido de lista
- Analiza todo el repositorio para determinar el estado de cada elemento y, luego, indexa solo los elementos nuevos o actualizados. Úsala para actualizaciones incrementales de un índice grande y no jerárquico cuando no se admita la detección de cambios.
- Recorrido de gráficos
- Analiza un nodo principal para determinar el estado de sus elementos y, luego, indexa los elementos nuevos o actualizados en ese nodo. Luego, procesa de forma recursiva los nodos secundarios. Usa este método para los repositorios jerárquicos en los que no es práctico hacer una lista de todos los IDs, como las estructuras de directorios o los sitios web.
El SDK implementa estas estrategias en clases de conectores de plantilla. Estas plantillas pueden acelerar tu desarrollo. Para usar una plantilla, consulta la sección correspondiente:
- Crea un conector de recorrido completo con una clase de plantilla
- Crea un conector de recorrido de lista con una clase de plantilla
- Crea un conector de recorrido de grafo con una clase de plantilla
Crea un conector de recorrido completo mediante el uso de una clase de plantilla
En esta sección, se hace referencia al código de FullTraversalSample.
Implementa el punto de entrada del conector
El punto de entrada es el método main(). Crea una instancia de Application y llama a start() para ejecutar el conector.
Antes de llamar a application.start(), usa la clase IndexingApplication.Builder para crear una instancia de la plantilla FullTraversalConnector. Esta plantilla acepta un objeto Repository.
El SDK llama a initConfig() después de que tu método main() llama a Application.build(). El método initConfig():
- Garantiza que
Configurationaún no se haya inicializado. - Inicializa el objeto
Configurationcon los pares clave-valor proporcionados por Google.
Implementa la interfaz Repository
El objeto Repository recorre e indexa los elementos del repositorio. Cuando usas una plantilla, solo debes anular ciertos métodos en la interfaz Repository. Para FullTraversalConnector, anula lo siguiente:
init(): Para la configuración y la inicialización del repositorio.getAllDocs(): Para recorrer e indexar todos los elementos. Se llama a este método una vez por cada recorrido programado.- (Opcional)
getChanges(): Si tu repositorio admite la detección de cambios, anula este método para recuperar y, luego, indexar los elementos modificados. - (Opcional)
close(): Para la limpieza del repositorio durante el cierre.
Cada método devuelve un objeto ApiOperation, que realiza la indexación con IndexingService.indexItem().
Obtén parámetros de configuración personalizados
Para controlar la configuración del conector, debes recuperar los parámetros personalizados del objeto Configuration. Realiza esta tarea en el método init() de la clase Repository.
La clase Configuration incluye métodos para recuperar diferentes tipos de datos.
Cada método devuelve un objeto ConfigValue. Usa el método get() del objeto ConfigValue para recuperar el valor. En este fragmento de FullTraversalSample, se muestra cómo recuperar un valor entero personalizado:
Para recuperar y analizar parámetros con varios valores, usa uno de los analizadores de tipos de la clase Configuration. En este fragmento del conector del instructivo, se usa getMultiValue para recuperar una lista de nombres de repositorios de GitHub:
Realiza un recorrido completo
Anula getAllDocs() para realizar un recorrido completo. Este método acepta un punto de control para reanudar la indexación si se interrumpe. Para cada elemento:
- Establece permisos.
- Establece metadatos.
- Combínalos en un
RepositoryDoc. - Empaqueta cada elemento en el iterador que muestra
getAllDocs().
Si el conjunto de elementos es demasiado grande para una sola llamada, usa un punto de control y llama a hasMore(true).
Establece los permisos para un elemento
Los repositorios usan listas de control de acceso (LCA) para identificar a los usuarios o grupos con acceso a un elemento. En una LCA, se enumeran los IDs de los usuarios o grupos autorizados.
Para garantizar que los usuarios solo vean los resultados de la búsqueda a los que tienen autorización para acceder, debes replicar las LCA de tu repositorio. Incluye la LCA cuando indexes un elemento para que Google Cloud Search pueda proporcionar el nivel de acceso correcto.
El SDK de Content Connector incluye clases y métodos para modelar las LCA de la mayoría de los repositorios. Analiza las LCA de tu repositorio y crea las LCA correspondientes para Cloud Search durante la indexación. El modelado de ACL complejas, como las que usan herencia, requiere una planificación cuidadosa. Para obtener más información, consulta LCA de Cloud Search.
Usa la clase Acl.Builder para establecer el acceso. Este fragmento del ejemplo de recorrido completo permite que todos los usuarios del dominio (getCustomerPrincipal()) lean todos los elementos (setReaders()):
Para modelar correctamente las LCA del repositorio, en especial las que usan modelos de herencia, se requiere la información que se encuentra en LCA de Cloud Search.
Establece los metadatos de un elemento
Los metadatos se almacenan en un objeto Item. Para crear un Item, necesitas un ID único, un tipo de elemento, una LCA, una URL y una versión. Usa la clase de asistente IndexingItemBuilder.
Crea el elemento indexable
Usa la clase RepositoryDoc.Builder.
Un RepositoryDoc es un ApiOperation que realiza la solicitud de IndexingService.indexItem().
Usa el método setRequestMode() de la clase RepositoryDoc.Builder para establecer la solicitud de indexación en ASYNCHRONOUS o SYNCHRONOUS:
ASYNCHRONOUS- Este modo tiene una latencia de indexación a entrega más prolongada, pero admite una cuota de capacidad de procesamiento más grande. Usa el modo asíncrono para la indexación inicial (reabastecimiento) de un repositorio completo.
SYNCHRONOUS- Este modo tiene una latencia de indexación a entrega más corta, pero una cuota de capacidad de procesamiento más pequeña. Usa el modo síncrono para indexar las actualizaciones y los cambios del repositorio. Si no se especifica, el modo de solicitud predeterminado es
SYNCHRONOUS.
Empaqueta cada elemento indexable en un iterador
El método getAllDocs() devuelve un CheckpointCloseableIterable de objetos RepositoryDoc. Usa la clase CheckpointCloseableIterableImpl.Builder.
Próximos pasos
- (Opcional) Si la capacidad de procesamiento de indexación es lenta, consulta Cómo aumentar la tasa de indexación.
- Implementa
close()para liberar recursos (opcional). - Crea un conector de identidad (opcional).
Crea un conector de recorrido de lista mediante una clase de plantilla
La cola de indexación de Cloud Search contiene IDs y hashes opcionales para los elementos del repositorio. Un conector de recorrido de lista envía IDs a esta cola y los recupera para la indexación. Cloud Search mantiene estas colas para determinar el estado de los elementos, como las eliminaciones. Consulta La cola de indexación de Cloud Search.
En esta sección, se hace referencia a ListTraversalSample.
Implementa el punto de entrada del conector
El método main() crea una instancia de Application y llama a start(). Usa IndexingApplication.Builder para crear una instancia de la plantilla ListingConnector.
Implementa la interfaz Repository
Anula los siguientes métodos para ListingConnector:
init(): Para la configuración del repositorio.getIds(): Para recuperar los IDs y los hashes de todos los registrosgetDoc(): Para agregar, actualizar o borrar elementos del índicegetChanges(): Para actualizaciones incrementales con detección de cambios (opcional).close()(opcional): Para la limpieza del repositorio.
Realiza el recorrido de lista
Anula getIds() para recuperar IDs y hashes. Anula getDoc() para controlar cada elemento de la cola de indexación de Cloud Search.
Envía ID de elementos y valores hash
Anula getIds() para recuperar los IDs y los hashes de contenido. Empaquétalos en una solicitud de PushItems a la cola de indexación.
Usa PushItems.Builder para empaquetar los IDs y los hashes.
Recupera y controla cada elemento
Anula getDoc() para controlar los elementos de la cola de indexación. Los elementos pueden ser nuevos, modificados, sin cambios o borrados.
- Comprueba si el ID del elemento existe en el repositorio. De lo contrario, bórralo.
- Sondea el índice para obtener el estado. Si no se modificó (
ACCEPTED), no hagas nada. - Indexa los elementos nuevos o modificados: establece permisos, configura metadatos, combina en un
RepositoryDocy devuélvelo.
Controla los elementos borrados
En este fragmento, se muestra cómo determinar si un elemento existe y cómo borrarlo si no es así.
Controla elementos no modificados
Consulta la cola de indexación para controlar los elementos no modificados.
En el ejemplo, se usa un hash para detectar cambios.
Establece los permisos para un elemento
Los repositorios usan listas de control de acceso (LCA) para identificar a los usuarios o grupos con acceso a un elemento. En una LCA, se enumeran los IDs de los usuarios o grupos autorizados.
Para garantizar que los usuarios solo vean los resultados de la búsqueda a los que tienen autorización para acceder, debes replicar las LCA de tu repositorio. Incluye la LCA cuando indexes un elemento para que Google Cloud Search pueda proporcionar el nivel de acceso correcto.
El SDK de Content Connector incluye clases y métodos para modelar las LCA de la mayoría de los repositorios. Analiza las LCA de tu repositorio y crea las LCA correspondientes para Cloud Search durante la indexación. El modelado de ACL complejas, como las que usan herencia, requiere una planificación cuidadosa. Para obtener más información, consulta LCA de Cloud Search.
Usa la clase Acl.Builder para establecer el acceso. Este fragmento del ejemplo de recorrido completo permite que todos los usuarios del dominio (getCustomerPrincipal()) lean todos los elementos (setReaders()):
Para modelar correctamente las LCA del repositorio, en especial las que usan modelos de herencia, se requiere la información que se encuentra en LCA de Cloud Search.
Establece los metadatos de un elemento
Crea un elemento indexable
Usa el método setRequestMode() de la clase RepositoryDoc.Builder para establecer la solicitud de indexación en ASYNCHRONOUS o SYNCHRONOUS:
ASYNCHRONOUS- Este modo tiene una latencia de indexación a entrega más prolongada, pero admite una cuota de capacidad de procesamiento más grande. Usa el modo asíncrono para la indexación inicial (reabastecimiento) de un repositorio completo.
SYNCHRONOUS- Este modo tiene una latencia de indexación a entrega más corta, pero una cuota de capacidad de procesamiento más pequeña. Usa el modo síncrono para indexar las actualizaciones y los cambios del repositorio. Si no se especifica, el modo de solicitud predeterminado es
SYNCHRONOUS.
Próximos pasos
Aquí hay algunos pasos que puedes seguir:
- Implementa el método
close()para liberar cualquier recurso antes de finalizar el procedimiento (opcional). - Crea un conector de identidad mediante el SDK de Content Connector (opcional).
Crea un conector de recorrido de grafo mediante una clase de plantilla
La cola de indexación de Cloud Search contiene IDs y valores hash opcionales para cada elemento del repositorio. Un conector de recorrido de grafo envía los IDs de elementos a la cola de indexación de Google Cloud Search y los recupera uno por uno para la indexación. Google Cloud Search mantiene colas y compara contenidos de cola para determinar el estado del elemento, por ejemplo, si un elemento se ha borrado del repositorio. Para obtener más información sobre la cola de indexación de Cloud Search, consulta La cola de indexación de Google Cloud Search.
Durante la indexación, el contenido del elemento se recupera del repositorio de datos y cualquier ID del elemento secundario se envía a la cola. El conector procesa de forma recursiva los IDs principales y secundarios hasta que se controlan todos los elementos.
Implementa el punto de entrada del conector
El punto de entrada a un conector es el método main(). Este método crea una instancia de la clase Application y llama a su método start() para ejecutar el conector.
Antes de llamar a application.start(), usa la clase IndexingApplication.Builder para crear una instancia de la plantilla ListingConnector. El objeto ListingConnector acepta un objeto Repository cuyos métodos implementarás.
Implementa la interfaz Repository
Anula init(), getIds(), getDoc() y, de manera opcional, getChanges() o close().
Realiza el recorrido de grafo
Anula getIds() para recuperar los IDs iniciales y getDoc() para controlar los elementos y enviar los IDs secundarios a la cola.
Envía ID de elementos y valores hash
Recupera y controla cada elemento
- Comprueba si el ID existe en el repositorio. Si no es así, borra el elemento.
- En el caso de los elementos existentes, establece permisos y metadatos, y combínalos en un
RepositoryDoc. - Envía los IDs secundarios a la cola de indexación.
- Devuelve el
RepositoryDoc.
Controla los elementos borrados
Establece los metadatos y crea el elemento
Coloca los IDs secundarios en la cola de indexación
Crea un conector de contenido con la API de REST
Las siguientes secciones explican cómo crear un conector de contenido con la API de REST.
Determina tu estrategia de recorrido
Las estrategias (Completa, Lista y Gráfico) son conceptualmente las mismas que para el SDK. Implementa la estrategia que elegiste con la API de REST.
Implementa tu estrategia de recorrido y los elementos de índice
Registra tu esquema y, luego, propaga el índice con lo siguiente:
items.uploadpara archivos de más de 100 KiB (opcional)media.upload(opcional) para archivos multimediaitems.indexpara indexar el elemento.Ejemplo de solicitud de indexación:
{ "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" }Opcional: Usa
items.getpara verificar la indexación.
Maneja cambios en el repositorio
Vuelve a indexar periódicamente todo el repositorio para realizar una indexación completa. Para el recorrido de listas o grafos, usa la cola de indexación de Google Cloud para hacer un seguimiento de los cambios y solo indexar lo que se modificó. Usa items.push para agregar elementos a la fila.