Bereichern Sie Ihre Dokumente während der Aufnahme - Amazon Kendra

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Bereichern Sie Ihre Dokumente während der Aufnahme

Sie können Ihre Inhalts- und Dokumentmetadatenfelder oder -Attribute während des Erfassungsprozesses des Dokuments ändern. Mit Amazon Kendra der Funktion zur benutzerdefinierten Dokumentanreicherung können Sie Dokumentattribute und Inhalte erstellen, ändern oder löschen, wenn Sie Ihre Dokumente in aufnehmen. Amazon Kendra Das bedeutet, dass Sie Ihre Daten nach Bedarf bearbeiten und aufnehmen können.

Mit dieser Funktion haben Sie die Kontrolle darüber, wie Ihre Dokumente behandelt und aufgenommen Amazon Kendra werden. Sie können beispielsweise persönlich identifizierbare Informationen in den Metadaten des Dokuments entfernen, während Sie Ihre Dokumente in das Dokument aufnehmen. Amazon Kendra

Sie können diese Funktion auch verwenden, indem Sie eine Lambda-Funktion aufrufen, AWS Lambda um die optische Zeichenerkennung (OCR) für Bilder, die Übersetzung von Text und andere Aufgaben zur Vorbereitung der Daten für die Suche oder Analyse auszuführen. Sie können beispielsweise eine Funktion aufrufen, um OCR auf Bildern auszuführen. Die Funktion könnte Text aus Bildern interpretieren und jedes Bild als Textdokument behandeln. Ein Unternehmen, das Kundenumfragen per Post erhält und diese Umfragen als Bilder speichert, könnte diese Bilder als Textdokumente aufnehmen. Amazon Kendra Das Unternehmen kann dann in nach wertvollen Informationen zu Kundenumfragen suchenAmazon Kendra.

Sie können grundlegende Operationen verwenden, um sie als erste Analyse Ihrer Daten anzuwenden, und dann eine Lambda-Funktion verwenden, um komplexere Operationen auf Ihre Daten anzuwenden. Sie könnten beispielsweise eine einfache Operation verwenden, um einfach alle Werte im Metadatenfeld 'Customer_ID' des Dokuments zu entfernen und dann eine Lambda-Funktion anzuwenden, um Text aus Bildern des Texts in den Dokumenten zu extrahieren.

So funktioniert Custom Document Enrichment

Der Gesamtprozess von Custom Document Enrichment sieht wie folgt aus:

  1. Sie konfigurieren Custom Document Enrichment, wenn Sie Ihre Datenquelle erstellen oder aktualisieren oder Ihre Dokumente direkt in Amazon Kendra indexieren.

  2. Amazon Kendrawendet Inline-Konfigurationen oder grundlegende Logik an, um Ihre Daten zu ändern. Weitere Informationen finden Sie unter Grundlegende Operationen zum Ändern von Metadaten.

  3. Wenn Sie sich dafür entscheiden, die erweiterte Datenmanipulation zu konfigurieren, Amazon Kendra können Sie dies auf Ihre ursprünglichen Rohdokumente oder auf die strukturierten, analysierten Dokumente anwenden. Weitere Informationen finden Sie unter Lambda-Funktionen: Metadaten oder Inhalte extrahieren und ändern.

  4. Ihre geänderten Dokumente werden aufgenommen. Amazon Kendra

Wenn Ihre Konfiguration zu irgendeinem Zeitpunkt dieses Vorgangs nicht gültig ist, wird Amazon Kendra ein Fehler ausgelöst.

Wenn Sie BatchPutDocumentAPIs aufrufen CreateDataSourceUpdateDataSource, oder geben Sie Ihre Custom Document Enrichment-Konfiguration an. Wenn Sie anrufenBatchPutDocument, müssen Sie Custom Document Enrichment bei jeder Anfrage konfigurieren. Wenn Sie die Konsole verwenden, wählen Sie Ihren Index und dann Document Enrichments aus, um Custom Document Enrichment zu konfigurieren.

Wenn Sie Document Enrichments in der Konsole verwenden, können Sie wählen, ob Sie nur grundlegende Operationen oder nur Lambda-Funktionen oder beides konfigurieren möchten, wie Sie es mit der API tun können. Sie können in den Konsolenschritten Weiter auswählen, um keine grundlegenden Operationen und nur Lambda-Funktionen zu konfigurieren, einschließlich der Frage, ob diese auf die Originaldaten (vor der Extraktion) oder auf strukturierte Daten (nach der Extraktion) angewendet werden sollen. Sie können Ihre Konfigurationen nur speichern, indem Sie alle Schritte in der Konsole ausführen. Ihre Dokumentkonfigurationen werden nicht gespeichert, wenn Sie nicht alle Schritte abgeschlossen haben.

Grundlegende Operationen zum Ändern von Metadaten

Sie können Ihre Dokumentfelder und Inhalte mithilfe grundlegender Logik manipulieren. Dazu gehören das Entfernen von Werten in einem Feld, das Ändern von Werten in einem Feld mithilfe einer Bedingung oder das Erstellen eines Felds. Rufen Sie für fortgeschrittene Manipulationen, die über das hinausgehen, was Sie mit grundlegender Logik manipulieren können, eine Lambda-Funktion auf. Weitere Informationen finden Sie unter Lambda-Funktionen: Metadaten oder Inhalte extrahieren und ändern.

Um grundlegende Logik anzuwenden, geben Sie das Zielfeld an, das Sie mithilfe des DocumentAttributeTargetObjekts manipulieren möchten. Sie geben den Attributschlüssel an. Der Schlüssel „Abteilung“ ist beispielsweise ein Feld oder Attribut, das alle Abteilungsnamen enthält, die den Dokumenten zugeordnet sind. Sie können auch einen Wert angeben, der im Zielfeld verwendet werden soll, wenn eine bestimmte Bedingung erfüllt ist. Sie legen die Bedingung mithilfe des DocumentAttributeConditionObjekts fest. Wenn das Feld 'source_URI' beispielsweise 'financial' in seinem URI-Wert enthält, füllen Sie das Zielfeld 'Department' vorab mit dem Zielwert 'Finanzen' für das Dokument aus. Sie können auch die Werte des Zieldokumentattributs löschen.

Um die grundlegende Logik mithilfe der Konsole anzuwenden, wählen Sie Ihren Index und dann im Navigationsmenü die Option Document Enrichments aus. Gehen Sie zu Grundfunktionen konfigurieren, um grundlegende Manipulationen an Ihren Dokumentfeldern und Inhalten vorzunehmen.

Im Folgenden finden Sie ein Beispiel für die Verwendung einer einfachen Logik zum Entfernen aller Kundenidentifikationsnummern aus dem Dokumentfeld mit dem Namen 'Customer_ID'.

Beispiel 1: Entfernen der mit den Dokumenten verknüpften Kundenidentifikationsnummern

Daten vor der grundlegenden Manipulation.

Dokument-ID Haupttext_Text Kunden_ID
1 Lorem Ipsum. CID1234
2 Lorem Ipsum. CID1235
3 Lorem Ipsum. CID1236

Daten nach erfolgter grundlegender Manipulation.

Dokument-ID Haupttext_Text Kunden_ID
1 Lorem Ipsum.
2 Lorem Ipsum.
3 Lorem Ipsum.

Im Folgenden finden Sie ein Beispiel für die Verwendung grundlegender Logik, um ein Feld mit dem Namen „Abteilung“ zu erstellen und dieses Feld anhand der Informationen aus dem Feld „source_URI“ mit den Abteilungsnamen vorzufüllen. Dabei wird die Bedingung verwendet, dass, wenn das Feld 'source_URI' in seinem URI-Wert 'financial' enthält, das Zielfeld 'Department' mit dem Zielwert 'Finanzen' für das Dokument vorab ausgefüllt wird.

Beispiel 2: Erstellen Sie das Feld „Abteilung“ und füllen Sie es mithilfe einer Bedingung mit den Abteilungsnamen aus, die den Dokumenten zugeordnet sind.

Daten vor der grundlegenden Manipulation.

Dokument-ID Haupttext_Text Quelle_URI
1 Lorem Ipsum. finanziell/1
2 Lorem Ipsum. finanziell/2
3 Lorem Ipsum. finanziell/3

Daten nach erfolgter grundlegender Manipulation.

Dokument-ID Haupttext_Text Quelle_URI Abteilung
1 Lorem Ipsum. finanziell/1 Finanzen
2 Lorem Ipsum. finanziell/2 Finanzen
3 Lorem Ipsum. finanziell/3 Finanzen
Anmerkung

Amazon Kendrakann kein Zieldokumentfeld erstellen, wenn es nicht bereits als Indexfeld erstellt wurde. Nachdem Sie Ihr Indexfeld erstellt haben, können Sie mithilfe vonDocumentAttributeTarget. Amazon Kendraordnet dann Ihr neu erstelltes Dokumentmetadatenfeld Ihrem Indexfeld zu.

Der folgende Code ist ein Beispiel für die Konfiguration der grundlegenden Datenmanipulation, um die mit den Dokumenten verknüpften Kundenidentifikationsnummern zu entfernen.

Console
So konfigurieren Sie die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern
  1. Wählen Sie im linken Navigationsbereich unter Indizes die Option Dokumentanreicherungen und dann Dokumentanreicherung hinzufügen aus.

  2. Wählen Sie auf der Seite „Grundlegende Operationen konfigurieren“ aus der Dropdown-Liste Ihre Datenquelle aus, für die Sie die Dokumentfelder und den Inhalt ändern möchten. Wählen Sie dann aus der Dropdown-Liste den Dokumentfeldnamen 'Customer_ID', wählen Sie aus der Dropdown-Liste den Indexfeldnamen 'Customer_ID' und wählen Sie aus der Dropdown-Liste die Zielaktion Löschen aus. Wählen Sie dann Basisoperation hinzufügen aus.

CLI

So konfigurieren Sie die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern

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

So konfigurieren Sie die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern

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

So konfigurieren Sie die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern

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

Lambda-Funktionen: Metadaten oder Inhalte extrahieren und ändern

Sie können Ihre Dokumentfelder und Inhalte mithilfe von Lambda-Funktionen bearbeiten. Dies ist nützlich, wenn Sie über die grundlegende Logik hinausgehen und erweiterte Datenmanipulationen anwenden möchten. Verwenden Sie beispielsweise die optische Zeichenerkennung (OCR), die Text aus Bildern interpretiert und jedes Bild als Textdokument behandelt. Oder Sie rufen das aktuelle Datum und die Uhrzeit in einer bestimmten Zeitzone ab und fügen das Datum und die Uhrzeit ein, wenn ein leerer Wert für ein Datumsfeld vorhanden ist.

Sie können zuerst grundlegende Logik anwenden und dann eine Lambda-Funktion verwenden, um Ihre Daten weiter zu manipulieren, oder umgekehrt. Sie können sich auch dafür entscheiden, nur eine Lambda-Funktion anzuwenden.

Amazon Kendrakann eine Lambda-Funktion aufrufen, um erweiterte Datenmanipulationen während des Erfassungsprozesses als Teil Ihres durchzuführen. CustomDocumentEnrichmentConfiguration Sie geben eine Rolle an, die die Berechtigung beinhaltet, die Lambda-Funktion auszuführen und auf Ihren Amazon S3 Bucket zuzugreifen, um die Ausgabe Ihrer Datenmanipulationen zu speichern — IAM siehe Zugriffsrollen.

Amazon Kendrakann eine Lambda-Funktion auf Ihre ursprünglichen Rohdokumente oder auf die strukturierten, analysierten Dokumente anwenden. Sie können eine Lambda-Funktion konfigurieren, die Ihre Original- oder Rohdaten verwendet und Ihre Datenmanipulationen mithilfe von. PreExtractionHookConfiguration Sie können auch eine Lambda-Funktion konfigurieren, die Ihre strukturierten Dokumente verwendet und Ihre Datenmanipulationen mithilfe von. PostExtractionHookConfiguration Amazon Kendraextrahiert die Metadaten und den Text des Dokuments, um Ihre Dokumente zu strukturieren. Ihre Lambda-Funktionen müssen den obligatorischen Anfrage- und Antwortstrukturen folgen. Weitere Informationen finden Sie unter Datenverträge für Lambda-Funktionen.

Um eine Lambda-Funktion in der Konsole zu konfigurieren, wählen Sie Ihren Index und dann im Navigationsmenü die Option Document Enrichments aus. Gehen Sie zu Lambda-Funktionen konfigurieren, um eine Lambda-Funktion zu konfigurieren.

Sie können nur eine Lambda-Funktion für PreExtractionHookConfiguration und nur eine Lambda-Funktion für konfigurieren. PostExtractionHookConfiguration Ihre Lambda-Funktion kann jedoch andere Funktionen aufrufen, die sie benötigt. Sie können beide und/oder PreExtractionHookConfiguration eines davon konfigurieren. PostExtractionHookConfiguration Ihre Lambda-Funktion für PreExtractionHookConfiguration darf eine Laufzeit von 5 Minuten nicht überschreiten und Ihre Lambda-Funktion für PostExtractionHookConfiguration darf eine Laufzeit von 1 Minute nicht überschreiten. Die Konfiguration von Custom Document Enrichment dauert natürlich länger, bis Ihre Dokumente aufgenommen werden, Amazon Kendra als wenn Sie dies nicht konfigurieren würden.

Sie können so konfigurierenAmazon Kendra, dass eine Lambda-Funktion nur aufgerufen wird, wenn eine Bedingung erfüllt ist. Sie können beispielsweise eine Bedingung angeben, nach der bei leeren Datums- und Uhrzeitwerten eine Funktion aufgerufen werden Amazon Kendra soll, die die aktuelle Uhrzeit einfügt.

Im Folgenden finden Sie ein Beispiel für die Verwendung einer Lambda-Funktion zur Ausführung von OCR, um Text aus Bildern zu interpretieren und diesen Text in einem Feld namens 'Document_Image_Text' zu speichern.

Beispiel 1: Extrahieren von Text aus Bildern zur Erstellung von Textdokumenten

Daten, bevor die erweiterte Manipulation angewendet wurde.

Dokument-ID Dokument_Bild
1 image_1.png
2 image_2.png
3 image_3.png

Daten nach Anwendung erweiterter Manipulationen.

Dokument-ID Dokument_Bild Dokument_Bild_Text
1 image_1.png Antwort auf die Umfrage per Post
2 image_2.png Antwort auf die Umfrage per Post
3 image_3.png Antwort auf die Umfrage per Post

Im Folgenden finden Sie ein Beispiel für die Verwendung einer Lambda-Funktion zum Einfügen der aktuellen Datums- und Uhrzeitangabe für leere Datumswerte. Dabei wird die Bedingung verwendet, dass, wenn ein Datumsfeldwert 'Null' ist, dieser durch das aktuelle Datum und Uhrzeit ersetzt wird.

Beispiel 2: Ersetzen leerer Werte im Feld Last_Updated durch das aktuelle Datum und Uhrzeit.

Daten, bevor die erweiterte Manipulation angewendet wurde.

Dokument-ID Haupttext_Text Zuletzt aktualisiert
1 Lorem Ipsum. 1. Januar 2020
2 Lorem Ipsum.
3 Lorem Ipsum. 1. Juli 2020

Daten nach Anwendung erweiterter Manipulationen.

Dokument-ID Haupttext_Text Zuletzt aktualisiert
1 Lorem Ipsum. 1. Januar 2020
2 Lorem Ipsum. 1. Dezember 2021
3 Lorem Ipsum. 1. Juli 2020

Der folgende Code ist ein Beispiel für die Konfiguration einer Lambda-Funktion für die erweiterte Datenmanipulation an den rohen Originaldaten.

Console
Um eine Lambda-Funktion für erweiterte Datenmanipulationen an den rohen Originaldaten zu konfigurieren
  1. Wählen Sie im linken Navigationsbereich unter Indizes die Option Dokumentanreicherungen und dann Dokumentanreicherung hinzufügen aus.

  2. Wählen Sie auf der Seite Lambda-Funktionen konfigurieren im Abschnitt Lambda for Pre-Extraction aus den Dropdownlisten Ihren Lambda-Funktions-ARN und Ihren Bucket aus. Amazon S3 Fügen Sie Ihre IAM Zugriffsrolle hinzu, indem Sie in der Dropdown-Liste die Option zum Erstellen einer neuen Rolle auswählen. Dadurch werden die erforderlichen Amazon Kendra Berechtigungen für die Erstellung der Dokumentanreicherung erstellt.

CLI

Um eine Lambda-Funktion für erweiterte Datenmanipulationen an den rohen Originaldaten zu konfigurieren

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

Um eine Lambda-Funktion für erweiterte Datenmanipulationen an den rohen Originaldaten zu konfigurieren

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

Um eine Lambda-Funktion für erweiterte Datenmanipulationen an den rohen Originaldaten zu konfigurieren

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

Datenverträge für Lambda-Funktionen

Ihre Lambda-Funktionen für erweiterte Datenmanipulation interagieren mit Amazon Kendra Datenverträgen. Die Verträge sind die verbindlichen Anfrage- und Antwortstrukturen Ihrer Lambda-Funktionen. Wenn Ihre Lambda-Funktionen diesen Strukturen nicht folgen, wird ein Amazon Kendra Fehler ausgegeben.

Ihre Lambda-Funktion für PreExtractionHookConfiguration sollte die folgende Anforderungsstruktur erwarten:

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

Die metadata Struktur, die die CustomDocumentAttribute Struktur einschließt, sieht wie folgt aus:

{ "attributes": [<CustomDocumentAttribute<] } CustomDocumentAttribute { "name": <str>, "value": <CustomDocumentAttributeValue> } CustomDocumentAttributeValue { "stringValue": <str>, "integerValue": <int>, "longValue": <long>, "stringListValue": list<str>, "dateValue": <str> }

Ihre Lambda-Funktion für PreExtractionHookConfiguration muss der folgenden Antwortstruktur entsprechen:

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

Ihre Lambda-Funktion für PostExtractionHookConfiguration sollte die folgende Anforderungsstruktur erwarten:

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

Ihre Lambda-Funktion für PostExtractionHookConfiguration muss der folgenden Antwortstruktur entsprechen:

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

Ihr geändertes Dokument wird in Ihren Amazon S3 Bucket hochgeladen. Das geänderte Dokument muss dem angegebenen Format entsprechenStrukturiertes Dokumentenformat.

Strukturiertes Dokumentenformat

Amazon Kendralädt Ihr strukturiertes Dokument in den angegebenen Amazon S3 Bucket hoch. Das strukturierte Dokument folgt diesem Format:

Kendra document { "textContent": <TextContent> } TextContent { "documentBodyText": <str> }

Beispiel für eine Lambda-Funktion, die Datenverträge einhält

Der folgende Python-Code ist ein Beispiel für eine Lambda-Funktion, die erweiterte Manipulationen der Metadatenfelder _authors und des _document_title Hauptinhalts auf die Rohdokumente oder Originaldokumente anwendet.

Im Fall, dass sich der Körperinhalt in einem Amazon S3 Eimer befindet

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

Im Fall, dass sich der Textinhalt in einem Datenblob befindet

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

Der folgende Python-Code ist ein Beispiel für eine Lambda-Funktion, die eine erweiterte Manipulation der Metadatenfelder _authors und des _document_title Textinhalts auf die strukturierten oder analysierten Dokumente anwendet.

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