

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Arricchimento dei documenti durante l'ingestione
<a name="custom-document-enrichment"></a>

**Nota**  
Il supporto delle funzionalità varia in base al tipo di indice e all'API di ricerca utilizzata. Per verificare se questa funzionalità è supportata per il tipo di indice e l'API di ricerca che stai utilizzando, consulta [Tipi di indice](https://docs.aws.amazon.com/kendra/latest/dg/hiw-index-types.html).

Puoi modificare i campi o gli attributi dei metadati del contenuto e del documento durante il processo di inserimento del documento. Con Amazon Kendra la funzione *Custom Document Enrichment*, è possibile creare, modificare o eliminare gli attributi e il contenuto del documento quando si inseriscono i documenti. Amazon Kendra Ciò significa che puoi manipolare e importare i tuoi dati in base alle tue esigenze.

Questa funzionalità consente di controllare il modo in cui i documenti vengono trattati e inseriti. Amazon Kendra Ad esempio, potete cancellare le informazioni di identificazione personale dai metadati del documento mentre inserite i documenti. Amazon Kendra

Un altro modo per utilizzare questa funzionalità consiste AWS Lambda nell'invocare una funzione Lambda per eseguire il riconoscimento ottico dei caratteri (OCR) sulle immagini, la traduzione sul testo e altre attività per la preparazione dei dati per la ricerca o l'analisi. Ad esempio, è possibile richiamare una funzione per eseguire l'OCR sulle immagini. La funzione può interpretare il testo delle immagini e trattare ogni immagine come un documento testuale. Un'azienda che riceve sondaggi tra i clienti per posta e li archivia come immagini potrebbe inserirle come documenti testuali. Amazon Kendra L'azienda può quindi cercare preziose informazioni sui sondaggi tra i clienti in. Amazon Kendra

È possibile utilizzare le operazioni di base da applicare come prima analisi dei dati e quindi utilizzare una funzione Lambda per applicare operazioni più complesse sui dati. Ad esempio, è possibile utilizzare un'operazione di base per rimuovere semplicemente tutti i valori nel campo dei metadati del documento 'Customer\_ID' e quindi applicare una funzione Lambda per estrarre il testo dalle immagini del testo nei documenti.

## Come funziona Custom Document Enrichment
<a name="how-custom-document-enrichment-works"></a>

Il processo complessivo di Custom Document Enrichment è il seguente:

1. Si configura Custom Document Enrichment quando si crea o si aggiorna la fonte di dati o si indicizza direttamente i documenti in. Amazon Kendra

1. Amazon Kendra applica configurazioni in linea o logica di base per modificare i dati. Per ulteriori informazioni, consulta [Operazioni di base per modificare i metadati](#basic-data-maniplation).

1. Se scegli di configurare la manipolazione avanzata dei dati, Amazon Kendra puoi applicarla ai tuoi documenti grezzi originali o ai documenti strutturati e analizzati. Per ulteriori informazioni, consulta [Funzioni Lambda: estrai e modifica metadati o contenuti](#advanced-data-manipulation).

1. I tuoi documenti modificati vengono inseriti in. Amazon Kendra

In qualsiasi momento di questo processo, se la configurazione non è valida, Amazon Kendra genera un errore.

Quando [CreateDataSource](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CreateDataSource.html)chiami o fornisci [UpdateDataSource](https://docs.aws.amazon.com/kendra/latest/APIReference/API_UpdateDataSource.html)la tua [BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchPutDocument.html) APIsconfigurazione Custom Document Enrichment. Se si chiama`BatchPutDocument`, è necessario configurare Custom Document Enrichment con ogni richiesta. Se si utilizza la console, si seleziona l'indice e quindi si seleziona **Document Enrichments per configurare Custom Document** Enrichment.

Se utilizzi **Document richments** nella console, puoi scegliere di configurare solo le operazioni di base o solo le funzioni Lambda o entrambe, come puoi usare l'API. Puoi selezionare **Avanti** nei passaggi della console per scegliere di non configurare le operazioni di base e solo le funzioni Lambda, incluso se applicarle ai dati originali (pre-estrazione) o strutturati (post-estrazione). Puoi salvare le configurazioni solo completando tutti i passaggi nella console. Le configurazioni dei documenti non vengono salvate se non completi tutti i passaggi.

## Operazioni di base per modificare i metadati
<a name="basic-data-maniplation"></a>

È possibile manipolare i campi e il contenuto del documento utilizzando la logica di base. Ciò include la rimozione di valori in un campo, la modifica dei valori in un campo utilizzando una condizione o la creazione di un campo. Per manipolazioni avanzate che vanno oltre ciò che puoi manipolare utilizzando la logica di base, richiama una funzione Lambda. Per ulteriori informazioni, consulta [Funzioni Lambda: estrai e modifica metadati o contenuti](#advanced-data-manipulation).

Per applicare la logica di base, specificate il campo di destinazione che desiderate manipolare utilizzando l'oggetto. [DocumentAttributeTarget](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttributeTarget.html) Fornisci la chiave dell'attributo. Ad esempio, la chiave 'Dipartimento' è un campo o un attributo che contiene tutti i nomi dei reparti associati ai documenti. È inoltre possibile specificare un valore da utilizzare nel campo di destinazione se viene soddisfatta una determinata condizione. La condizione viene impostata utilizzando l'[DocumentAttributeCondition](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttributeCondition.html)oggetto. Ad esempio, se il campo 'Source\_URI' contiene 'financial' nel suo valore URI, precompila il campo di destinazione 'Department' con il valore di destinazione 'Finance' per il documento. È inoltre possibile eliminare i valori dell'attributo del documento di destinazione.

Per applicare la logica di base utilizzando la console, seleziona l'indice, quindi seleziona **Arricchimenti del documento** nel menu di navigazione. Vai a **Configura le operazioni di base** per applicare le manipolazioni di base ai campi e al contenuto del documento.

Di seguito è riportato un esempio di utilizzo della logica di base per rimuovere tutti i numeri di identificazione dei clienti nel campo del documento denominato «Customer\_ID».

**Esempio 1: rimozione dei numeri di identificazione dei clienti associati ai documenti**

Dati prima dell'applicazione della manipolazione di base.


| **ID\_documento** | **Testo del corpo** | **ID\_cliente** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | CID1234 | 
| 2 | Lorem Ipsum. | CID1235 | 
| 3 | Lorem Ipsum. | CID1236 | 

Dati dopo l'applicazione di manipolazioni di base.


| **ID\_documento** | **Testo del corpo** | **ID\_cliente** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. |   | 
| 2 | Lorem Ipsum. |   | 
| 3 | Lorem Ipsum. |   | 

Di seguito è riportato un esempio di utilizzo della logica di base per creare un campo chiamato «Dipartimento» e precompilare questo campo con i nomi dei reparti in base alle informazioni del campo «Source\_URI». Ciò utilizza la condizione che se il campo «Source\_URI» contiene «finanziario» nel suo valore URI, precompila il campo di destinazione «Dipartimento» con il valore di destinazione «Finance» per il documento.

**Esempio 2: creazione del campo «Dipartimento» e precompilazione con i nomi dei reparti associati ai documenti utilizzando una condizione.**

Dati prima dell'applicazione della manipolazione di base.


| **ID\_documento** | **Testo del corpo** | **URI\_sorgente** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | financial/1 | 
| 2 | Lorem Ipsum. | financial/2 | 
| 3 | Lorem Ipsum. | financial/3 | 

Dati dopo l'applicazione di manipolazioni di base.


| **ID\_documento** | **Testo del corpo** | **URI\_sorgente** | **Reparto** | 
| --- | --- | --- | --- | 
| 1 | Lorem Ipsum. | financial/1 | Ambito finanziario | 
| 2 | Lorem Ipsum. | financial/2 | Ambito finanziario | 
| 3 | Lorem Ipsum. | financial/3 | Ambito finanziario | 

**Nota**  
Amazon Kendra non può creare un campo del documento di destinazione se non è già stato creato come campo indice. Dopo aver creato il campo indice, puoi creare un campo del documento utilizzando`DocumentAttributeTarget`. Amazon Kendra quindi associa il campo di metadati del documento appena creato al campo indice.

Il codice seguente è un esempio di configurazione di base della manipolazione dei dati per rimuovere i numeri di identificazione dei clienti associati ai documenti.

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

**Come configurare la manipolazione di base dei dati per rimuovere i numeri di identificazione dei clienti**

1. **Nel riquadro di navigazione a sinistra, in **Indici**, seleziona **Arricchimenti del documento, quindi seleziona Aggiungi arricchimento** del documento.**

1. Nella pagina **Configura le operazioni di base**, scegli dal menu a discesa la fonte di dati che desideri modificare, i campi e il contenuto del documento. **Quindi scegli dal menu a discesa il nome del campo del documento «ID\_cliente», seleziona dal menu a discesa il nome del campo indice «ID\_cliente» e seleziona dal menu a discesa l'azione di destinazione Elimina.** **Quindi seleziona Aggiungi operazione di base.**

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

**Come configurare la manipolazione di base dei dati per rimuovere i numeri di identificazione dei clienti**

```
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 ]

**Come configurare la manipolazione di base dei dati per rimuovere i numeri di identificazione dei clienti**

```
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 ]

**Come configurare la manipolazione di base dei dati per rimuovere i numeri di identificazione dei clienti**

```
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");
    }
}
```

------

## Funzioni Lambda: estrai e modifica metadati o contenuti
<a name="advanced-data-manipulation"></a>

È possibile manipolare i campi e il contenuto del documento utilizzando le funzioni Lambda. Ciò è utile se si desidera andare oltre la logica di base e applicare manipolazioni avanzate dei dati. Ad esempio, utilizzando il riconoscimento ottico dei caratteri (OCR), che interpreta il testo dalle immagini e tratta ogni immagine come un documento testuale. Oppure, recuperando la data-ora corrente in un determinato fuso orario e inserendo la data-ora in cui è presente un valore vuoto per un campo di data.

È possibile applicare prima la logica di base e poi utilizzare una funzione Lambda per manipolare ulteriormente i dati o viceversa. Puoi anche scegliere di applicare solo una funzione Lambda.

Amazon Kendra può richiamare una funzione Lambda per applicare manipolazioni avanzate dei dati durante il processo di ingestione come parte del tuo. [CustomDocumentEnrichmentConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) [Specificate un ruolo che include il permesso di eseguire la funzione Lambda e accedere al vostro Amazon S3 bucket per archiviare l'output delle manipolazioni IAM dei dati. Vedi ruoli di accesso.](https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html)

Amazon Kendra può applicare una funzione Lambda sui documenti grezzi originali o sui documenti strutturati e analizzati. È possibile configurare una funzione Lambda che prende i dati originali o non elaborati e applica le manipolazioni dei dati utilizzando. [PreExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) Puoi anche configurare una funzione Lambda che prende i tuoi documenti strutturati e li utilizza per applicare le tue manipolazioni dei dati. [PostExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CustomDocumentEnrichmentConfiguration.html) Amazon Kendra estrae i metadati e il testo del documento per strutturare i documenti. Le tue funzioni Lambda devono seguire le strutture obbligatorie di richiesta e risposta. Per ulteriori informazioni, consulta [Contratti dati per le funzioni Lambda](#cde-data-contracts-lambda).

Per configurare una funzione Lambda nella console, seleziona il tuo indice, quindi seleziona **Arricchimenti del documento** nel menu di navigazione. Vai a **Configura le funzioni Lambda per configurare una funzione** Lambda.

È possibile configurare solo una funzione Lambda per `PreExtractionHookConfiguration` e e solo una funzione Lambda per. `PostExtractionHookConfiguration` Tuttavia, la funzione Lambda può richiamare altre funzioni che richiede. È possibile configurare entrambe le configurazioni, `PreExtractionHookConfiguration` e `PostExtractionHookConfiguration`, oppure una delle due. La funzione Lambda per non `PreExtractionHookConfiguration` deve superare un tempo di esecuzione di 5 minuti e la funzione Lambda per non `PostExtractionHookConfiguration` deve superare un tempo di esecuzione di 1 minuto. La configurazione di Custom Document Enrichment richiede naturalmente più tempo per l'inserimento dei documenti Amazon Kendra rispetto a quando non la configurassi.

È possibile configurare Amazon Kendra per richiamare una funzione Lambda solo se viene soddisfatta una condizione. Ad esempio, è possibile specificare una condizione in base alla quale, se sono presenti valori di data-ora vuoti, Amazon Kendra deve richiamare una funzione che inserisce la data-ora corrente.

Di seguito è riportato un esempio di utilizzo di una funzione Lambda per eseguire l'OCR per interpretare il testo dalle immagini e memorizzarlo in un campo chiamato 'Document\_Image\_Text'.

**Esempio 1: estrazione di testo da immagini per creare documenti testuali**

Dati prima dell'applicazione della manipolazione avanzata.


| **ID\_documento** | **Immagine\_documento** | 
| --- | --- | 
| 1 | image\_1.png | 
| 2 | image\_2.png | 
| 3 | image\_3.png | 

Dati dopo l'applicazione di manipolazioni avanzate.


| **ID\_documento** | **Immagine\_documento** | **Testo dell'immagine\_del documento** | 
| --- | --- | --- | 
| 1 | image\_1.png | Risposta al sondaggio inviata | 
| 2 | image\_2.png | Risposta al sondaggio inviata | 
| 3 | image\_3.png | Risposta al sondaggio inviata | 

Di seguito è riportato un esempio di utilizzo di una funzione Lambda per inserire la data-ora corrente per valori di data vuoti. Ciò utilizza la condizione che se il valore di un campo data è 'nullo', sostituiscilo con la data-ora corrente.

**Esempio 2: sostituzione dei valori vuoti nel campo Last\_Updated con la data-ora corrente.**

Dati prima dell'applicazione della manipolazione avanzata.


| **ID\_documento** | **Testo del corpo** | **Ultimo\_aggiornamento** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | 1 gennaio 2020 | 
| 2 | Lorem Ipsum. |   | 
| 3 | Lorem Ipsum. | 1 luglio 2020 | 

Dati dopo l'applicazione di manipolazioni avanzate.


| **ID\_documento** | **Testo del corpo** | **Ultimo\_aggiornamento** | 
| --- | --- | --- | 
| 1 | Lorem Ipsum. | 1 gennaio 2020 | 
| 2 | Lorem Ipsum. | 1° dicembre 2021 | 
| 3 | Lorem Ipsum. | 1 luglio 2020 | 

Il codice seguente è un esempio di configurazione di una funzione Lambda per la manipolazione avanzata dei dati su dati grezzi e originali.

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

**Per configurare una funzione Lambda per la manipolazione avanzata dei dati su dati grezzi e originali**

1. **Nel riquadro di navigazione a sinistra, in **Indici**, seleziona **Arricchimenti del documento, quindi seleziona Aggiungi arricchimento** del documento.**

1. Nella pagina **Configura le funzioni Lambda**, nella sezione **Lambda per la pre-estrazione**, seleziona dai menu a discesa l'ARN della funzione Lambda e il bucket. Amazon S3 Aggiungi il tuo ruolo di IAM accesso selezionando l'opzione per creare un nuovo ruolo dal menu a discesa. Questo crea le Amazon Kendra autorizzazioni necessarie per creare l'arricchimento del documento.

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

**Per configurare una funzione Lambda per la manipolazione avanzata dei dati su dati grezzi e originali**

```
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 ]

**Per configurare una funzione Lambda per la manipolazione avanzata dei dati su dati grezzi e originali**

```
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 ]

**Per configurare una funzione Lambda per la manipolazione avanzata dei dati su dati grezzi e originali**

```
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");
    }
}
```

------

## Contratti dati per le funzioni Lambda
<a name="cde-data-contracts-lambda"></a>

Le funzioni Lambda per la manipolazione avanzata dei dati interagiscono con Amazon Kendra i contratti di dati. I contratti sono le strutture obbligatorie di richiesta e risposta delle tue funzioni Lambda. Se le tue funzioni Lambda non seguono queste strutture, Amazon Kendra genera un errore.

La funzione Lambda per `PreExtractionHookConfiguration` dovrebbe utilizzare la seguente struttura di richiesta:

```
{
    "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>
}
```

La struttura `metadata`, che include la struttura `CustomDocumentAttribute`, è la seguente:

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

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

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

La funzione Lambda per `PreExtractionHookConfiguration` deve soddisfare la seguente struttura di risposta:

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

La funzione Lambda per `PostExtractionHookConfiguration` dovrebbe utilizzare la seguente struttura di richiesta:

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

La funzione Lambda per `PostExtractionHookConfiguration` deve soddisfare la seguente struttura di risposta:

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

Il documento modificato viene caricato nel tuo bucket. Amazon S3 Il documento modificato deve seguire il formato mostrato in. [Formato del documento strutturato](#structured-document-format)

### Formato del documento strutturato
<a name="structured-document-format"></a>

Amazon Kendra carica il documento strutturato nel Amazon S3 bucket specificato. Il documento strutturato segue questo formato:

```
Kendra document

{
   "textContent": <TextContent>
}

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

### Esempio di una funzione Lambda che aderisce ai contratti di dati
<a name="example-lambda-function-advanced-manipulation"></a>

Il seguente codice Python è un esempio di funzione Lambda che applica la manipolazione avanzata dei campi `_authors` dei metadati e del contenuto del corpo dei documenti grezzi o originali. `_document_title`

**Nel caso in cui il contenuto del corpo risieda in un secchio 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"]}}
        ]
    }
```

**Nel caso del contenuto corporeo che risiede in un blob di dati**

```
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"]}}
        ]
    }
```

Il seguente codice Python è un esempio di funzione Lambda che applica la manipolazione avanzata dei campi `_authors` di metadati e del contenuto del corpo nei `_document_title` documenti strutturati o analizzati.

```
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"]}}
        ]
    }
```