

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Enriquecendo seus documentos durante a absorção
<a name="custom-document-enrichment"></a>

**nota**  
A compatibilidade com os recursos varia de acordo com o tipo de índice e a API de pesquisa usada. Consulte se esse recurso é compatível com o tipo de índice e a API de pesquisa que você está usando em [Tipos de índice](https://docs.aws.amazon.com/kendra/latest/dg/hiw-index-types.html).

Você pode alterar os campos ou atributos de metadados do conteúdo e do documento durante o processo de absorção de documentos. Com Amazon Kendra o recurso de *enriquecimento personalizado de documentos*, você pode criar, modificar ou excluir atributos e conteúdo do documento ao ingerir seus documentos. Amazon Kendra Isso significa que você pode manipular e absorver os dados conforme necessário.

Esse atributo oferece controle sobre como os documentos são tratados e absorvidos. Amazon Kendra Por exemplo, você pode limpar informações de identificação pessoal nos metadados do documento enquanto ingere seus documentos. Amazon Kendra

Outra forma de usar esse recurso é invocar uma função AWS Lambda Lambda para executar o reconhecimento óptico de caracteres (OCR) em imagens, tradução em texto e outras tarefas para preparar os dados para pesquisa ou análise. Por exemplo, você pode invocar uma função para executar o OCR em imagens. A função pode interpretar texto de imagens e tratar cada imagem como um documento textual. Uma empresa que recebe pesquisas de clientes enviadas por e-mail e as armazena como imagens pode gerar essas imagens como documentos de texto no Amazon Kendra. A empresa pode então pesquisar informações valiosas sobre pesquisas com clientes no Amazon Kendra.

Você pode usar operações básicas para aplicar como a primeira análise dos dados e, em seguida, usar uma função do Lambda para aplicar operações mais complexas nos dados. Por exemplo, use uma operação básica para simplesmente remover todos os valores no campo de metadados do documento 'Customer\$1ID' e depois aplicar uma função do Lambda para extrair texto das imagens do texto nos documentos.

## Como funciona o enriquecimento personalizado de documentos
<a name="how-custom-document-enrichment-works"></a>

O processo geral de enriquecimento personalizado de documentos é o seguinte:

1. Você configura o Enriquecimento Personalizado de Documentos ao criar ou atualizar sua fonte de dados ou ao indexar seus documentos diretamente no Amazon Kendra.

1. Amazon Kendra aplica configurações em linha ou lógica básica para alterar seus dados. Para obter mais informações, consulte [Operações básicas para alterar metadados](#basic-data-maniplation).

1. Se você optar por configurar a manipulação avançada de dados, Amazon Kendra poderá aplicá-la em seus documentos originais brutos ou nos documentos estruturados e analisados. Para obter mais informações, consulte [Funções do Lambda: extrair e alterar metadados ou conteúdo](#advanced-data-manipulation).

1. Seus documentos alterados são inseridos em. Amazon Kendra

Em qualquer momento desse processo, se a configuração não for válida, Amazon Kendra gerará um erro.

Quando você liga [CreateDataSource](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CreateDataSource.html), [UpdateDataSource[BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchPutDocument.html)](https://docs.aws.amazon.com/kendra/latest/APIReference/API_UpdateDataSource.html) APIs, ou fornece sua configuração de enriquecimento personalizado de documentos. Se escolher `BatchPutDocument`, deverá configurar o enriquecimento personalizado de documentos com cada solicitação. Se você usa o console, seleciona o índice e, em seguida, selecione **Enriquecimentos de documentos** para configurar o enriquecimento personalizado de documentos.

Se você usar o **enriquecimentos de documentos** no console, poderá optar por configurar somente as operações básicas, somente as funções do Lambda ou as duas, como ao usar a API. Selecione **Avançar** nas etapas do console para optar por não configurar operações básicas e somente as funções do Lambda, incluindo se deseja aplicar aos dados originais (pré-extração) ou estruturados (pós-extração). Você só pode salvar as configurações ao concluir todas as etapas no console. As configurações do documento não serão salvas se você não concluir todas as etapas.

## Operações básicas para alterar metadados
<a name="basic-data-maniplation"></a>

Você pode manipular os campos e o conteúdo do documento usando a lógica básica. Isso inclui remover valores em um campo, modificar valores em um campo usando uma condição ou criar um campo. Para manipulações avançadas que vão além do que você pode manipular usando a lógica básica, invoque uma função do Lambda. Para obter mais informações, consulte [Funções do Lambda: extrair e alterar metadados ou conteúdo](#advanced-data-manipulation).

Para aplicar a lógica básica, você especifica o campo de destino que deseja manipular usando o [DocumentAttributeTarget](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttributeTarget.html)objeto. Forneça a chave de atributo. Por exemplo, a chave “Departamento” é um campo ou atributo que contém todos os nomes de departamentos associados aos documentos. Você também pode especificar um valor a ser usado no campo de destino se uma determinada condição for atendida. Você define a condição usando o [DocumentAttributeCondition](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttributeCondition.html)objeto. por exemplo, se o campo “Source\$1URI” contiver “financeiro” como valor de URI, o campo de destino “Departmento” será preenchido previamente com o valor de destino “Financeiro” para o documento. Você também pode excluir os valores do atributo do documento de destino.

Para aplicar a lógica básica usando o console, selecione o índice e, em seguida, selecione **Enriquecimentos de documentos** no menu de navegação. Acesse **Configurar operações básicas** para aplicar manipulações básicas aos campos e ao conteúdo do documento.

O exemplo a seguir é do uso da lógica básica para remover todos os números de identificação do cliente no campo “Customer\$1ID”.

**Exemplo 1: remoção dos números de identificação do cliente associados aos documentos**

Dados antes da aplicação da manipulação básica.


| **Document\$1ID** | **Body\$1Text** | **Customer\$1ID** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | CID1234 | 
| 2 | Lorem Ipsum. | CID1235 | 
| 3 | Lorem Ipsum. | CID1236 | 

Dados antes da aplicação da manipulação básica.


| **Document\$1ID** | **Body\$1Text** | **Customer\$1ID** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. |   | 
| 2 | Lorem Ipsum. |   | 
| 3 | Lorem Ipsum. |   | 

Veja a seguir um exemplo do uso da lógica básica para criar um campo chamado “Departamento” e preencher previamente esse campo com os nomes dos departamentos com base nas informações do campo do “Source\$1URI”. Isso define a condição estabelecendo que, se o campo “Source\$1URI” contiver “financial” (financeiro) como valor de URI, o campo de destino “Department” (Departamento) será preenchido previamente com o valor de destino “Financeiro” para o documento.

**Exemplo 2: criar o campo “Departamento” e preenchê-lo previamente com os nomes dos departamentos associados aos documentos usando uma condição.**

Dados antes da aplicação da manipulação básica.


| **Document\$1ID** | **Body\$1Text** | **Source\$1URI** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | financeiro/1 | 
| 2 | Lorem Ipsum. | financeiro/2 | 
| 3 | Lorem Ipsum. | financeiro/3 | 

Dados antes da aplicação da manipulação básica.


| **Document\$1ID** | **Body\$1Text** | **Source\$1URI** | **Departamento** | 
| --- | --- | --- | --- | 
| 1 | Lorem Ipsum. | financeiro/1 | Financeiro | 
| 2 | Lorem Ipsum. | financeiro/2 | Finanças | 
| 3 | Lorem Ipsum. | financeiro/3 | Finanças | 

**nota**  
Amazon Kendra não é possível criar um campo de documento de destino se ele ainda não tiver sido criado como um campo de índice. Depois de criar seu campo de índice, você pode criar um campo de documento usando `DocumentAttributeTarget` o. Amazon Kendra em seguida, mapeia o campo de metadados do documento recém-criado para o campo de índice.

O código a seguir é um exemplo de como configurar a manipulação básica de dados para remover os números de identificação do cliente associados aos documentos.

------
#### [ Console ]

**Para configurar a manipulação básica de dados para remover números de identificação do cliente**

1. No painel de navegação esquerdo, em **Índices**, selecione **Enriquecimentos de documentos** e, em seguida, selecione **Adicionar enriquecimento de documentos**.

1. Na página **Configurar operações básicas**, escolha na lista suspensa a fonte de dados que você deseja alterar os campos e o conteúdo do documento. **Em seguida, escolha no menu suspenso o nome do campo do documento “Customer\$1ID”, selecione no menu suspenso o nome do campo do índice “Customer\$1ID” e selecione no menu suspenso a ação de destino Excluir.** Em seguida, selecione **Adicionar operação básica**.

------
#### [ CLI ]

**Para configurar a manipulação básica de dados para remover números de identificação do cliente**

```
aws kendra create-data-source \
 --name data-source-name \
 --index-id index-id \
 --role-arn arn:aws:iam::account-id:role/role-name \
 --type S3 \
 --configuration '{"S3Configuration":{"BucketName":"S3-bucket-name"}}' \
 --custom-document-enrichment-configuration '{"InlineConfigurations":[{"Target":{"TargetDocumentAttributeKey":"Customer_ID", "TargetDocumentAttributeValueDeletion": true}}]}'
```

------
#### [ Python ]

**Para configurar a manipulação básica de dados para remover números de identificação do cliente**

```
import boto3
from botocore.exceptions import ClientError
import pprint
import time

kendra = boto3.client("kendra")

print("Create a data source with customizations")

# Provide the name of the data source
name = "data-source-name"
# Provide the index ID for the data source
index_id = "index-id"
# Provide the IAM role ARN required for data sources
role_arn = "arn:aws:iam::${account-id}:role/${role-name}"
# Provide the data source connection information
data_source_type = "S3"
S3_bucket_name = "S3-bucket-name"
# Configure the data source with Custom Document Enrichment
configuration = {"S3Configuration":
        {
            "BucketName": S3_bucket_name
        }
    }
custom_document_enrichment_configuration = {"InlineConfigurations":[
        {
            "Target":{"TargetDocumentAttributeKey":"Customer_ID",
                       "TargetDocumentAttributeValueDeletion": True}
        }]
    }

try:
    data_source_response = kendra.create_data_source(
        Name = name,
        IndexId = index_id,
        RoleArn = role_arn,
        Type = data_source_type
        Configuration = configuration
        CustomDocumentEnrichmentConfiguration = custom_document_enrichment_configuration
    )

    pprint.pprint(data_source_response)

    data_source_id = data_source_response["Id"]

    print("Wait for Amazon Kendra to create the data source with your customizations.")

    while True:
        # Get the details of the data source, such as the status
        data_source_description = kendra.describe_data_source(
            Id = data_source_id,
            IndexId = index_id
        )
        status = data_source_description["Status"]
        print(" Creating data source. Status: "+status)
        time.sleep(60)
        if status != "CREATING":
            break

    print("Synchronize the data source.")

    sync_response = kendra.start_data_source_sync_job(
        Id = data_source_id,
        IndexId = index_id
    )

    pprint.pprint(sync_response)

    print("Wait for the data source to sync with the index.")

    while True:

        jobs = kendra.list_data_source_sync_jobs(
            Id= data_source_id,
            IndexId= index_id
        )

        # For this example, there should be one job
        status = jobs["History"][0]["Status"]

        print(" Syncing data source. Status: "+status)
        time.sleep(60)
        if status != "SYNCING":
            break

except  ClientError as e:
        print("%s" % e)

print("Program ends.")
```

------
#### [ Java ]

**Para configurar a manipulação básica de dados para remover números de identificação do cliente**

```
package com.amazonaws.kendra;

import java.util.concurrent.TimeUnit;
import software.amazon.awssdk.services.kendra.KendraClient;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.CreateIndexRequest;
import software.amazon.awssdk.services.kendra.model.CreateIndexResponse;
import software.amazon.awssdk.services.kendra.model.DataSourceConfiguration;
import software.amazon.awssdk.services.kendra.model.DataSourceStatus;
import software.amazon.awssdk.services.kendra.model.DataSourceSyncJob;
import software.amazon.awssdk.services.kendra.model.DataSourceSyncJobStatus;
import software.amazon.awssdk.services.kendra.model.DataSourceType;
import software.amazon.awssdk.services.kendra.model.DescribeDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.DescribeDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.DescribeIndexRequest;
import software.amazon.awssdk.services.kendra.model.DescribeIndexResponse;
import software.amazon.awssdk.services.kendra.model.IndexStatus;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse;
import software.amazon.awssdk.services.kendra.model.S3DataSourceConfiguration;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse;

public class CreateDataSourceWithCustomizationsExample {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Create a data source with customizations");
        
        String dataSourceName = "data-source-name";
        String indexId = "index-id";
        String dataSourceRoleArn = "arn:aws:iam::account-id:role/role-name";
        String s3BucketName = "S3-bucket-name"

        KendraClient kendra = KendraClient.builder().build();
        
        CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest
            .builder()
            .name(dataSourceName)
            .description(experienceDescription)
            .roleArn(experienceRoleArn)
            .type(DataSourceType.S3)
            .configuration(
                DataSourceConfiguration
                    .builder()
                    .s3Configuration(
                        S3DataSourceConfiguration
                            .builder()
                            .bucketName(s3BucketName)
                            .build()
                    ).build()
            )
            .customDocumentEnrichmentConfiguration(
                CustomDocumentEnrichmentConfiguration
                    .builder()
                    .inlineConfigurations(Arrays.asList(
                        InlineCustomDocumentEnrichmentConfiguration
                            .builder()
                            .target(
                                DocumentAttributeTarget
                                    .builder()
                                    .targetDocumentAttributeKey("Customer_ID")
                                    .targetDocumentAttributeValueDeletion(true)
                                    .build())
                            .build()
                    )).build();
        
        CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest);
        System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse));

        String dataSourceId = createDataSourceResponse.id();
        System.out.println(String.format("Waiting for Kendra to create the data source %s", dataSourceId));
        DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest
            .builder()
            .indexId(indexId)
            .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));
            TimeUnit.SECONDS.sleep(60);
            if (status != DataSourceStatus.CREATING) {
                break;
            }
        }

        System.out.println(String.format("Synchronize the data source %s", dataSourceId));
        StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest
            .builder()
            .indexId(indexId)
            .id(dataSourceId)
            .build();
        StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest);
        System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId()));

        // For this example, there should be one job
        ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest
            .builder()
            .indexId(indexId)
            .id(dataSourceId)
            .build();

        while (true) {
            ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest);
            DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0);
            System.out.println(String.format("Syncing data source. Status: %s", job.status()));

            TimeUnit.SECONDS.sleep(60);
            if (job.status() != DataSourceSyncJobStatus.SYNCING) {
                break;
            }

        }

        System.out.println("Data source creation with customizations is complete");
    }
}
```

------

## Funções do Lambda: extrair e alterar metadados ou conteúdo
<a name="advanced-data-manipulation"></a>

Você pode manipular os campos e o conteúdo do documento usando as funções do Lambda. Isso é útil se você quiser ir além da lógica básica e aplicar manipulações avançadas de dados. Por exemplo, ao usar o reconhecimento óptico de caracteres (OCR), que interpreta texto de imagens e trata cada imagem como um documento de texto. Ou recuperando a data e hora atual em um determinado fuso horário e inserindo a data e hora em que há um valor vazio para um campo de data.

Você pode aplicar a lógica básica primeiro e depois usar uma função do Lambda para manipular ainda mais os dados, ou vice-versa. Você também pode optar por aplicar somente uma função do Lambda.

Amazon Kendra pode invocar uma função Lambda para aplicar manipulações avançadas de dados durante o processo de ingestão como parte do seu. [CustomDocumentEnrichmentConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) [Você especifica uma função que inclui permissão para executar a função Lambda e acessar seu Amazon S3 bucket para armazenar a saída de suas manipulações IAM de dados — consulte funções de acesso.](https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html)

Amazon Kendra pode aplicar uma função Lambda em seus documentos originais brutos ou nos documentos estruturados e analisados. Você pode configurar uma função Lambda que pega seus dados originais ou brutos e aplica suas manipulações de dados usando. [PreExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) Você também pode configurar uma função Lambda que pega seus documentos estruturados e aplica suas manipulações de dados usando. [PostExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) Amazon Kendra extrai os metadados e o texto do documento para estruturar seus documentos. As funções do Lambda devem seguir as estruturas obrigatórias de solicitação e resposta. Para obter mais informações, consulte [Contratos de dados para funções do Lambda](#cde-data-contracts-lambda).

Para aplicar a função do Lambda usando o console, selecione o índice e, em seguida, selecione **Enriquecimentos de documentos** no menu de navegação. Acesse **Configurar funções do Lambda para configurar uma função** do Lambda.

Você pode configurar somente uma função do Lambda para `PreExtractionHookConfiguration` e somente mais uma função do Lambda para `PostExtractionHookConfiguration`. No entanto, essa função do Lambda pode invocar outras funções necessárias. Você pode configurar `PreExtractionHookConfiguration` e `PostExtractionHookConfiguration` e/ou um só deles. A função do Lambda para `PreExtractionHookConfiguration` não deve exceder um tempo de execução de 5 minutos e a função do Lambda para `PostExtractionHookConfiguration` não deve exceder o tempo de execução de 1 minuto. A configuração do enriquecimento personalizado de documentos naturalmente leva mais tempo para ingerir seus documentos Amazon Kendra do que se você não configurasse isso.

Você pode configurar Amazon Kendra para invocar uma função Lambda somente se uma condição for atendida. Por exemplo, você pode especificar uma condição de que, se houver valores de data e hora vazios, invoque uma função que insira a data e hora atual. Amazon Kendra 

Veja a seguir um exemplo do uso de uma função do Lambda para executar o OCR para interpretar texto de imagens e armazenar esse texto em um campo chamado “Document\$1Image\$1Text”.

**Exemplo 1: extraindo texto de imagens para criar documentos textuais**

Dados antes da aplicação da manipulação avançada.


| **Document\$1ID** | **Document\$1Image** | 
| --- | --- | 
| 1 | image\$11.png | 
| 2 | image\$12.png | 
| 3 | image\$13.png | 

Dados depois da aplicação da manipulação avançada.


| **Document\$1ID** | **Document\$1Image** | **Document\$1Image\$1Text** | 
| --- | --- | --- | 
| 1 | image\$11.png | Resposta de pesquisa enviada por e-mail | 
| 2 | image\$12.png | Resposta de pesquisa enviada por e-mail | 
| 3 | image\$13.png | Resposta de pesquisa enviada por e-mail | 

Veja a seguir um exemplo do uso de uma função do Lambda para inserir a data e hora atual para valores de data vazios. Isso usa a condição de que, se o valor do campo de data for “nulo”, ele deve ser substituído pela data e hora atual.

**Exemplo 2: substituindo valores vazios no campo Last\$1Updated pela data e hora atual.**

Dados antes da aplicação da manipulação avançada.


| **Document\$1ID** | **Body\$1Text** | **Last\$1Updated** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | 1º de janeiro de 2020 | 
| 2 | Lorem Ipsum. |   | 
| 3 | Lorem Ipsum. | 1.º de julho de 2020 | 

Dados depois da aplicação da manipulação avançada.


| **Document\$1ID** | **Body\$1Text** | **Last\$1Updated** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | 1º de janeiro de 2020 | 
| 2 | Lorem Ipsum. | 1º de dezembro de 2021 | 
| 3 | Lorem Ipsum. | 1.º de julho de 2020 | 

O código a seguir é um exemplo de configuração de uma função do Lambda para manipulação avançada de dados nos dados originais brutos.

------
#### [ Console ]

**Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos**

1. No painel de navegação esquerdo, em **Índices**, selecione **Enriquecimentos de documentos** e, em seguida, selecione **Adicionar enriquecimento de documentos**.

1. Na página **Configurar funções do Lambda**, na seção **Lambda para pré-extração**, selecione nos menus suspensos o ARN da função Lambda e seu bucket. Amazon S3 Adicione sua função de IAM acesso selecionando a opção de criar uma nova função no menu suspenso. Isso cria as Amazon Kendra permissões necessárias para criar o enriquecimento do documento.

------
#### [ CLI ]

**Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos**

```
aws kendra create-data-source \
 --name data-source-name \
 --index-id index-id \
 --role-arn arn:aws:iam::account-id:role/role-name \
 --type S3 \
 --configuration '{"S3Configuration":{"BucketName":"S3-bucket-name"}}' \
 --custom-document-enrichment-configuration '{"PreExtractionHookConfiguration":{"LambdaArn":"arn:aws:iam::account-id:function/function-name", "S3Bucket":"S3-bucket-name"}, "RoleArn": "arn:aws:iam:account-id:role/cde-role-name"}'
```

------
#### [ Python ]

**Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos**

```
import boto3
from botocore.exceptions import ClientError
import pprint
import time

kendra = boto3.client("kendra")

print("Create a data source with customizations.")

# Provide the name of the data source
name = "data-source-name"
# Provide the index ID for the data source
index_id = "index-id"
# Provide the IAM role ARN required for data sources
role_arn = "arn:aws:iam::${account-id}:role/${role-name}"
# Provide the data source connection information
data_source_type = "S3"
S3_bucket_name = "S3-bucket-name"
# Configure the data source with Custom Document Enrichment
configuration = {"S3Configuration":
        {
            "BucketName": S3_bucket_name
        }
    }
custom_document_enrichment_configuration = {"PreExtractionHookConfiguration":
        {
            "LambdaArn":"arn:aws:iam::account-id:function/function-name",
            "S3Bucket":"S3-bucket-name"
        }
    "RoleArn":"arn:aws:iam::account-id:role/cde-role-name"
    }

try:
    data_source_response = kendra.create_data_source(
        Name = name,
        IndexId = index_id,
        RoleArn = role_arn,
        Type = data_source_type
        Configuration = configuration
        CustomDocumentEnrichmentConfiguration = custom_document_enrichment_configuration
    )

    pprint.pprint(data_source_response)

    data_source_id = data_source_response["Id"]

    print("Wait for Amazon Kendra to create the data source with your customizations.")

    while True:
        # Get the details of the data source, such as the status
        data_source_description = kendra.describe_data_source(
            Id = data_source_id,
            IndexId = index_id
        )
        status = data_source_description["Status"]
        print(" Creating data source. Status: "+status)
        time.sleep(60)
        if status != "CREATING":
            break

    print("Synchronize the data source.")

    sync_response = kendra.start_data_source_sync_job(
        Id = data_source_id,
        IndexId = index_id
    )

    pprint.pprint(sync_response)

    print("Wait for the data source to sync with the index.")

    while True:

        jobs = kendra.list_data_source_sync_jobs(
            Id = data_source_id,
            IndexId = index_id
        )

        # For this example, there should be one job
        status = jobs["History"][0]["Status"]

        print(" Syncing data source. Status: "+status)
        time.sleep(60)
        if status != "SYNCING":
            break

except  ClientError as e:
        print("%s" % e)

print("Program ends.")
```

------
#### [ Java ]

**Para configurar uma função do Lambda para manipulação avançada de dados nos dados originais brutos**

```
package com.amazonaws.kendra;

import java.util.concurrent.TimeUnit;
import software.amazon.awssdk.services.kendra.KendraClient;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.CreateIndexRequest;
import software.amazon.awssdk.services.kendra.model.CreateIndexResponse;
import software.amazon.awssdk.services.kendra.model.DataSourceConfiguration;
import software.amazon.awssdk.services.kendra.model.DataSourceStatus;
import software.amazon.awssdk.services.kendra.model.DataSourceSyncJob;
import software.amazon.awssdk.services.kendra.model.DataSourceSyncJobStatus;
import software.amazon.awssdk.services.kendra.model.DataSourceType;
import software.amazon.awssdk.services.kendra.model.DescribeDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.DescribeDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.DescribeIndexRequest;
import software.amazon.awssdk.services.kendra.model.DescribeIndexResponse;
import software.amazon.awssdk.services.kendra.model.IndexStatus;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse;
import software.amazon.awssdk.services.kendra.model.S3DataSourceConfiguration;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse;


public class CreateDataSourceWithCustomizationsExample {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Create a data source with customizations");
        
        String dataSourceName = "data-source-name";
        String indexId = "index-id";
        String dataSourceRoleArn = "arn:aws:iam::account-id:role/role-name";
        String s3BucketName = "S3-bucket-name"

        KendraClient kendra = KendraClient.builder().build();
        
        CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest
            .builder()
            .name(dataSourceName)
            .description(experienceDescription)
            .roleArn(experienceRoleArn)
            .type(DataSourceType.S3)
            .configuration(
                DataSourceConfiguration
                    .builder()
                    .s3Configuration(
                        S3DataSourceConfiguration
                            .builder()
                            .bucketName(s3BucketName)
                            .build()
                    ).build()
            )
            .customDocumentEnrichmentConfiguration(
                CustomDocumentEnrichmentConfiguration
                    .builder()
                    .preExtractionHookConfiguration(
                        HookConfiguration
                            .builder()
                            .lambdaArn("arn:aws:iam::account-id:function/function-name")
                            .s3Bucket("S3-bucket-name")
                            .build())
                    .roleArn("arn:aws:iam::account-id:role/cde-role-name")
                    .build();
        
        CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest);
        System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse));

        String dataSourceId = createDataSourceResponse.id();
        System.out.println(String.format("Waiting for Kendra to create the data source %s", dataSourceId));
        DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest
            .builder()
            .indexId(indexId)
            .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));
            TimeUnit.SECONDS.sleep(60);
            if (status != DataSourceStatus.CREATING) {
                break;
            }
        }

        System.out.println(String.format("Synchronize the data source %s", dataSourceId));
        StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest
            .builder()
            .indexId(indexId)
            .id(dataSourceId)
            .build();
        StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest);
        System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId()));

        // For this example, there should be one job
        ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest
            .builder()
            .indexId(indexId)
            .id(dataSourceId)
            .build();

        while (true) {
            ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest);
            DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0);
            System.out.println(String.format("Syncing data source. Status: %s", job.status()));

            TimeUnit.SECONDS.sleep(60);
            if (job.status() != DataSourceSyncJobStatus.SYNCING) {
                break;
            }

        }

        System.out.println("Data source creation with customizations is complete");
    }
}
```

------

## Contratos de dados para funções do Lambda
<a name="cde-data-contracts-lambda"></a>

As funções do Lambda para manipulação avançada de dados interagem com os contratos de dados do Amazon Kendra . Os contratos são as estruturas obrigatórias de solicitação e resposta das funções do Lambda. Se suas funções do Lambda não seguirem essas estruturas, Amazon Kendra gerará um erro.

A função do Lambda para `PreExtractionHookConfiguration` deve esperar a seguinte estrutura de solicitação:

```
{
    "version": <str>,
    "dataBlobStringEncodedInBase64": <str>, //In the case of a data blob
    "s3Bucket": <str>, //In the case of an S3 bucket
    "s3ObjectKey": <str>, //In the case of an S3 bucket
    "metadata": <Metadata>
}
```

A estrutura `metadata`, que inclui a estrutura `CustomDocumentAttribute`, é a seguinte:

```
{
    "attributes": [<CustomDocumentAttribute<]
}

CustomDocumentAttribute
{
    "name": <str>,
    "value": <CustomDocumentAttributeValue>
}

CustomDocumentAttributeValue
{
    "stringValue": <str>,
    "integerValue": <int>,
    "longValue": <long>,
    "stringListValue": list<str>,
    "dateValue": <str>
}
```

A função do Lambda para `PreExtractionHookConfiguration` deve seguir a seguinte estrutura de resposta:

```
{
    "version": <str>,
    "dataBlobStringEncodedInBase64": <str>, //In the case of a data blob
    "s3ObjectKey": <str>, //In the case of an S3 bucket
    "metadataUpdates": [<CustomDocumentAttribute>]
}
```

A função do Lambda para `PostExtractionHookConfiguration` deve esperar a seguinte estrutura de solicitação:

```
{
    "version": <str>,
    "s3Bucket": <str>,
    "s3ObjectKey": <str>,
    "metadata": <Metadata>
}
```

A função do Lambda para `PostExtractionHookConfiguration` deve seguir a seguinte estrutura de resposta:

```
PostExtractionHookConfiguration Lambda Response
{
    "version": <str>,
    "s3ObjectKey": <str>,
    "metadataUpdates": [<CustomDocumentAttribute>]
}
```

Seu documento alterado é enviado para o seu Amazon S3 bucket. O documento alterado deve seguir o formato mostrado em [Formato de documento estruturado](#structured-document-format).

### Formato de documento estruturado
<a name="structured-document-format"></a>

Amazon Kendra carrega seu documento estruturado em um determinado Amazon S3 bucket. O documento estruturado segue esse formato:

```
Kendra document

{
   "textContent": <TextContent>
}

TextContent
{
  "documentBodyText": <str>
}
```

### Exemplo de uma função do Lambda que adere aos contratos de dados
<a name="example-lambda-function-advanced-manipulation"></a>

O código Python a seguir é um exemplo de uma função do Lambda que aplica manipulação avançada dos campos de metadados `_authors`, `_document_title` e do conteúdo do corpo nos documentos brutos ou originais. 

**No caso do conteúdo corporal residir em um balde Amazon S3 **

```
import json
import boto3
     
s3 = boto3.client("s3")

# Lambda function for advanced data manipulation    
def lambda_handler(event, context):
    # Get the value of "S3Bucket" key name or item from the given event input
    s3_bucket = event.get("s3Bucket")
    # Get the value of "S3ObjectKey" key name or item from the given event input
    s3_object_key = event.get("s3ObjectKey")
    
    content_object_before_CDE = s3.get_object(Bucket = s3_bucket, Key = s3_object_key)
    content_before_CDE = content_object_before_CDE["Body"].read().decode("utf-8");
    content_after_CDE = "CDEInvolved " + content_before_CDE
    
    # Get the value of "metadata" key name or item from the given event input
    metadata = event.get("metadata")
    # Get the document "attributes" from the metadata 
    document_attributes = metadata.get("attributes")
    
    s3.put_object(Bucket = s3_bucket, Key = "dummy_updated_kendra_document", Body=json.dumps(content_after_CDE))
    return {
        "version": "v0",
        "s3ObjectKey": "dummy_updated_kendra_document",
        "metadataUpdates": [
            {"name":"_document_title", "value":{"stringValue":"title_from_pre_extraction_lambda"}},
            {"name":"_authors", "value":{"stringListValue":["author1", "author2"]}}
        ]
    }
```

**No caso do conteúdo corporal estiver em um bucket do blob de dados**

```
import json
import boto3
import base64

# Lambda function for advanced data manipulation
def lambda_handler(event, context):
    
    # Get the value of "dataBlobStringEncodedInBase64" key name or item from the given event input 
    data_blob_string_encoded_in_base64 = event.get("dataBlobStringEncodedInBase64")
    # Decode the data blob string in UTF-8
    data_blob_string = base64.b64decode(data_blob_string_encoded_in_base64).decode("utf-8")
    # Get the value of "metadata" key name or item from the given event input    
    metadata = event.get("metadata")
    # Get the document "attributes" from the metadata
    document_attributes = metadata.get("attributes")
    
    new_data_blob = "This should be the modified data in the document by pre processing lambda ".encode("utf-8")
    return {
        "version": "v0",
        "dataBlobStringEncodedInBase64": base64.b64encode(new_data_blob).decode("utf-8"),
        "metadataUpdates": [
            {"name":"_document_title", "value":{"stringValue":"title_from_pre_extraction_lambda"}},
            {"name":"_authors", "value":{"stringListValue":["author1", "author2"]}}
        ]
    }
```

O código Python a seguir é um exemplo de uma função do Lambda que aplica manipulação avançada dos campos de metadados `_authors`, `_document_title` e do conteúdo do corpo nos documentos estruturados ou analisados.

```
import json
import boto3
import time

s3 = boto3.client("s3")

# Lambda function for advanced data manipulation
def lambda_handler(event, context):
    
    # Get the value of "S3Bucket" key name or item from the given event input
    s3_bucket = event.get("s3Bucket")
    # Get the value of "S3ObjectKey" key name or item from the given event input
    s3_key = event.get("s3ObjectKey")
    # Get the value of "metadata" key name or item from the given event input
    metadata = event.get("metadata")
    # Get the document "attributes" from the metadata 
    document_attributes = metadata.get("attributes")
    
    kendra_document_object = s3.get_object(Bucket = s3_bucket, Key = s3_key)
    kendra_document_string = kendra_document_object['Body'].read().decode('utf-8')
    kendra_document = json.loads(kendra_document_string)
    kendra_document["textContent"]["documentBodyText"] = "Changing document body to a short sentence."
    
    s3.put_object(Bucket = s3_bucket, Key = "dummy_updated_kendra_document", Body=json.dumps(kendra_document))

    return {
        "version" : "v0",
        "s3ObjectKey": "dummy_updated_kendra_document",
        "metadataUpdates": [
            {"name": "_document_title", "value":{"stringValue": "title_from_post_extraction_lambda"}},
            {"name": "_authors", "value":{"stringListValue":["author1", "author2"]}}
        ]
    }
```