

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Conector de orígenes de datos personalizados
<a name="data-source-custom"></a>

Utilice un origen de datos personalizado cuando tenga un repositorio para el que Amazon Kendra aún no proporcione un conector de origen de datos. Puede usarlo para ver las mismas métricas del historial de ejecución que proporcionan los orígenes de datos de Amazon Kendra, aunque no pueda utilizarlos para sincronizar los repositorios. Utilícelo para crear una experiencia de supervisión de sincronización coherente entre los orígenes de datos de Amazon Kendra y los personalizados. En concreto, utilice un origen de datos personalizado para ver las métricas de sincronización de un conector de origen de datos que haya creado con las API [BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchPutDocument.html) y [BatchDeleteDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchDeleteDocument.html).

Para solucionar problemas del conector de origen de datos personalizado de Amazon Kendra, consulte [Solución de problemas con los orígenes de datos](troubleshooting-data-sources.md).

Al crear un origen de datos personalizado, tiene el control total sobre cómo se seleccionan los documentos que se van a indexar. Amazon Kendra solo proporciona información de métricas que se puede utilizar para monitorizar los trabajos de sincronización del origen de datos. Debe crear y ejecutar el rastreador que determina los documentos que indexa su origen de datos.

Debe especificar el título principal de los documentos mediante el objeto [Document](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Document.html) y `_source_uri` en [DocumentAttribute](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttribute.html) para poder incluir `DocumentTitle` y `DocumentURI` en la respuesta del resultado de la `Query`.

Puede crear un identificador para su origen de datos personalizado mediante la consola o mediante la API [CreateDataSource](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CreateDataSource.html). Para usar la consola, asigne un nombre al origen de datos y, si lo desea, una descripción y etiquetas de recursos. Una vez creado el origen de datos, se muestra el ID correspondiente. Copie este ID para usarlo cuando sincronice el origen de datos con el índice.

![\[Form for specifying data source details, including name, description, and optional tags.\]](http://docs.aws.amazon.com/es_es/kendra/latest/dg/images/CustomDataSource.png)


También puede crear un origen de datos personalizada mediante la API `CreateDataSource`. La API devuelve un ID para usarlo al sincronizar el origen de datos. Cuando utiliza la API `CreateDataSource` para crear un origen de datos personalizado, no puede configurar los parámetros `Configuration`, `RoleArn` o `Schedule`. Si establece estos parámetros, Amazon Kendra devuelve una excepción `ValidationException`.

Para usar un origen de datos personalizado, cree una aplicación que se encargue de actualizar el índice de Amazon Kendra. La aplicación depende del rastreador que cree. El rastreador lee los documentos del repositorio y determina cuáles se deben enviar a Amazon Kendra. La aplicación debe realizar los pasos siguientes: 

1. Rastrear el repositorio y hacer una lista de los documentos del repositorio que se han agregado, actualizado o eliminado.

1. Llamar a la API [StartDataSourceSyncJob](https://docs.aws.amazon.com/kendra/latest/APIReference/API_StartDataSourceSyncJob.html) para indicar que se está iniciando un trabajo de sincronización. Se proporciona un ID de origen de datos para identificar el origen de datos que se está sincronizando. Amazon Kendra devuelve un ID de ejecución para identificar un trabajo de sincronización concreto.

1. Llamar a la API [BatchDeleteDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchDeleteDocument.html) para eliminar documentos del índice. Se proporciona el ID del origen de datos y el ID de ejecución para identificar el origen de datos que se está sincronizando y el trabajo al que está asociada esta actualización.

1. Llamar a la API [StopDataSourceSyncJob](https://docs.aws.amazon.com/kendra/latest/APIReference/API_StopDataSourceSyncJob.html) para indicar el final del trabajo de sincronización. Después de llamar a la API `StopDataSourceSyncJob`, el ID de ejecución asociado deja de ser válido.

1. Llamar a la API [ListDataSourceSyncJobs](https://docs.aws.amazon.com/kendra/latest/APIReference/API_ListDataSourceSyncJobs.html) con los identificadores del índice y del origen de datos para enumerar los trabajos de sincronización del origen de datos y ver las métricas correspondientes.

Tras finalizar un trabajo de sincronización, se puede iniciar uno nuevo. Puede transcurrir un tiempo antes de que todos los documentos enviados se añadan al índice. Use la API `ListDataSourceSyncJobs` para ver el estado del trabajo de sincronización. Si el `Status` devuelto para el trabajo de sincronización es `SYNCING_INDEXING`, algunos documentos aún se están indexando. Se puede iniciar un nuevo trabajo de sincronización cuando el estado del trabajo anterior sea `FAILED` o `SUCCEEDED`.

Después de llamar a la API `StopDataSourceSyncJob`, no se puede usar un identificador de trabajo de sincronización en una llamada a las API `BatchPutDocument` o `BatchDeleteDocument`. Si lo hace, todos los documentos enviados se devolverán en el mensaje de respuesta `FailedDocuments` de la API.

## Atributos obligatorios
<a name="custom-required-attributes"></a>

Al enviar un documento a Amazon Kendra mediante la API `BatchPutDocument`, cada documento requiere dos atributos para identificar el origen de datos y la ejecución de sincronización a la que pertenece. Debe proporcionar los dos atributos siguientes para asignar correctamente los documentos del origen de datos personalizado a un índice de Amazon Kendra:
+ `_data_source_id`: el identificador del origen de datos. Este se devuelve al crear el origen de datos con la consola o la API `CreateDataSource`.
+ `_data_source_sync_job_execution_id`: el identificador de la ejecución de sincronización. Se devuelve al iniciar la sincronización del índice con la API `StartDataSourceSyncJob`.

El siguiente es el JSON necesario para indexar un documento mediante un origen de datos personalizado.

```
{
    "Documents": [
        {
            "Attributes": [
                {
                    "Key": "_data_source_id",
                    "Value": {
                        "StringValue": "data source identifier"
                    }
                },
                {
                    "Key": "_data_source_sync_job_execution_id",
                    "Value": {
                        "StringValue": "sync job identifier"
                    }
                }
            ],
            "Blob": "document content",
            "ContentType": "content type",
            "Id": "document identifier",
            "Title": "document title"
        }
    ],
    "IndexId": "index identifier",
    "RoleArn": "IAM role ARN"
}
```

Al eliminar un documento del índice mediante la API `BatchDeleteDocument`, se deben especificar los dos campos siguientes en el parámetro `DataSourceSyncJobMetricTarget`:
+ `DataSourceId`: el identificador del origen de datos. Este se devuelve al crear el origen de datos con la consola o la API `CreateDataSource`.
+ `DataSourceSyncJobId`: el identificador de la ejecución de sincronización. Se devuelve al iniciar la sincronización del índice con la API `StartDataSourceSyncJob`.

El siguiente es el JSON necesario para eliminar un documento del índice mediante la API `BatchDeleteDocument`.

```
{
    "DataSourceSyncJobMetricTarget": {
        "DataSourceId": "data source identifier",
        "DataSourceSyncJobId": "sync job identifier"
    },
    "DocumentIdList": [
        "document identifier"
    ],
    "IndexId": "index identifier"
}
```

## Visualización de métricas
<a name="custom-metrics"></a>

Una vez finalizado un trabajo de sincronización, se puede usar la API [DataSourceSyncJobMetrics](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DataSourceSyncJobMetrics.html) para obtener las métricas asociadas al trabajo de sincronización. Utilícela para supervisar las sincronizaciones de sus orígenes de datos personalizados.

Si se envía el mismo documento varias veces, ya sea como parte de la API `BatchPutDocument`, la API `BatchDeleteDocument` o si el documento se envía tanto para su adición como para su eliminación, el documento solo se cuenta una vez en las métricas.
+ `DocumentsAdded`: la cantidad de documentos enviados mediante la API `BatchPutDocument` asociada a este trabajo de sincronización agregados al índice por primera vez. Si un documento se envía para agregarlo más de una vez en una sincronización, el documento solo se cuenta una vez en las métricas.
+ `DocumentsDeleted`: la cantidad de documentos enviados mediante la API `BatchDeleteDocument` asociada a este trabajo de sincronización eliminados del índice. Si un documento se envía para eliminarlo más de una vez en una sincronización, el documento solo se cuenta una vez en las métricas.
+ `DocumentsFailed`: el número de documentos asociados a este trabajo de sincronización que no se pudieron indexar. Se trata de documentos que fueron aceptados por Amazon Kendra para su indexación, pero que no se pudieron indexar ni eliminar. Si un documento no es aceptado por Amazon Kendra, el identificador del documento se devuelve en la propiedad de respuesta `FailedDocuments` de las API `BatchPutDocument` y `BatchDeleteDocument`.
+ `DocumentsModified`: la cantidad de documentos modificados enviados mediante la API `BatchPutDocument` asociada a este trabajo de sincronización que se modificaron en el índice de Amazon Kendra.

Amazon Kendra también emite métricas de Amazon CloudWatch al indexar los documentos. Para obtener más información, consulte [Monitorización de Amazon Kendra con Amazon CloudWatch](https://docs.aws.amazon.com/kendra/latest/dg/cloudwatch-metrics.html).

Amazon Kendra no devuelve la métrica `DocumentsScanned` de los orígenes de datos personalizados. También emite las métricas de CloudWatch que figuran en el documento [Métricas de los orígenes de datos de Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/cloudwatch-metrics.html#cloudwatch-metrics-data-source).

## Más información
<a name="custom-learn-more"></a>

Para obtener más información acerca de la integración de Amazon Kendra con el origen de datos personalizado, consulte:
+ [Agregar orígenes de datos personalizados a Amazon Kendra](https://aws.amazon.com/blogs/machine-learning/adding-custom-data-sources-to-amazon-kendra/)

# Origen de datos personalizado (Java)
<a name="custom-java-sample"></a>

El código siguiente proporciona un ejemplo de implementación de un origen de datos personalizado mediante Java. El programa crea primero un origen de datos personalizado y, a continuación, sincroniza los documentos recién agregados al índice con dicho origen.

El código siguiente muestra la creación y el uso de un origen de datos personalizado. Al utilizar un origen de datos personalizado en la aplicación, no es necesario crear un nuevo origen de datos (un proceso único) cada vez que se sincronice el índice con él. Se utiliza el ID de índice y el ID del origen de datos para sincronizar los datos.

```
package com.amazonaws.kendra;

import java.util.concurrent.TimeUnit;
import software.amazon.awssdk.services.kendra.KendraClient;
import csoftware.amazon.awssdk.services.kendra.model.BatchPutDocumentRequest;
import csoftware.amazon.awssdk.services.kendra.model.BatchPutDocumentResponse;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.DataSourceType;
import software.amazon.awssdk.services.kendra.model.Document;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse;
import software.amazon.awssdk.services.kendra.model.StopDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StopDataSourceSyncJobResponse;

public class SampleSyncForCustomDataSource {
  public static void main(String[] args) {
    KendraClient kendra = KendraClient.builder().build();

    String myIndexId = "yourIndexId";
    String dataSourceName = "custom data source";
    String dataSourceDescription = "Amazon Kendra custom data source connector"
	
    // Create custom data source
    CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest
        .builder()
        .indexId(myIndexId)
        .name(dataSourceName)
        .description(dataSourceDescription)
        .type(DataSourceType.CUSTOM)
        .build();
    	
    CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest);
    System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse));
	
    // Get the data source ID from createDataSourceResponse
    String dataSourceId = createDataSourceResponse.Id();

    // Wait for the custom data source to become active
    System.out.println(String.format("Waiting for Amazon Kendra to create the data source %s", dataSourceId));
    // You can use the DescribeDataSource API to check the status
    DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest
        .builder()
        .indexId(myIndexId)
        .id(dataSourceId)
        .build();

    while (true) {
        DescribeDataSourceResponse describeDataSourceResponse = kendra.describeDataSource(describeDataSourceRequest);

        DataSourceStatus status = describeDataSourceResponse.status();
        System.out.println(String.format("Creating data source. Status: %s", status));
        if (status != DataSourceStatus.CREATING) {
            break;
        }
        
        TimeUnit.SECONDS.sleep(60);
    }
    
    // Start syncing yor data source by calling StartDataSourceSyncJob and providing your index ID 
    // and your custom data source ID
    System.out.println(String.format("Synchronize the data source %s", dataSourceId));
    StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest
        .builder()
        .indexId(myIndexId)
        .id(dataSourceId)
        .build();
    StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest);
    
    // Get the  sync job execution ID from startDataSourceSyncJobResponse
    String executionId = startDataSourceSyncJobResponse.ExecutionId();
	System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId()));
    
    // Add 2 documents uploaded to S3 bucket to your index using the BatchPutDocument API
    // The added documents should sync with your custom data source
    Document pollyDoc = Document
        .builder()
        .s3Path(
            S3Path.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("what_is_Amazon_Polly.docx")
            .build())
        .title("What is Amazon Polly?")
        .id("polly_doc_1")
        .build();
    
    Document rekognitionDoc = Document
        .builder()
        .s3Path(
            S3Path.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("what_is_amazon_rekognition.docx")
            .build())
        .title("What is Amazon rekognition?")
        .id("rekognition_doc_1")
        .build();
    
    BatchPutDocumentRequest batchPutDocumentRequest = BatchPutDocumentRequest
        .builder()
        .indexId(myIndexId)
        .documents(pollyDoc, rekognitionDoc)
        .build();
    
    BatchPutDocumentResponse result = kendra.batchPutDocument(batchPutDocumentRequest);
    System.out.println(String.format("BatchPutDocument result: %s", result));
    
    // Once custom data source synced, stop the sync job using the StopDataSourceSyncJob API
    StopDataSourceSyncJobResponse stopDataSourceSyncJobResponse = kendra.stopDataSourceSyncJob(
        StopDataSourceSyncJobRequest()
            .indexId(myIndexId)
            .id(dataSourceId)
    );
	
	// List your sync jobs
    ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest
        .builder()
        .indexId(myIndexId)
        .id(dataSourceId)
        .build();
    
    while (true) {
        ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest);
        DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0);
        System.out.println(String.format("Status: %s", job.status()));
    }
  }
}
```