Anreicherung Ihrer 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.

Anreicherung Ihrer Dokumente während der Aufnahme

Anmerkung

Die Funktionsunterstützung variiert je nach Indextyp und API verwendeter Suche. Informationen darüber, ob diese Funktion für den von Ihnen verwendeten Indextyp und die von API Ihnen verwendete Suche unterstützt wird, finden Sie unter Indextypen.

Sie können die Felder oder Attribute Ihrer Inhalts- und Dokumentmetadaten während der Dokumentaufnahme ändern. Mit Amazon Kendra der Funktion zur benutzerdefinierten Dokumentenanreicherung können Sie Dokumentattribute und -inhalte erstellen, ändern oder löschen, wenn Sie Ihre Dokumente 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 werden. Amazon Kendra So können Sie beispielsweise persönlich identifizierbare Informationen aus den Metadaten des Dokuments löschen, 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 Optical Character Recognition (OCR) für Bilder, Übersetzungen für Text und andere Aufgaben zur Vorbereitung der Daten für die Suche oder Analyse auszuführen. Sie können beispielsweise eine Funktion aufrufen, die auf Bildern ausgeführt wirdOCR. 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 suchen. Amazon 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 Dokumentmetadatenfeld 'Customer_ID' zu entfernen und dann eine Lambda-Funktion anzuwenden, um Text aus Bildern des Textes in den Dokumenten zu extrahieren.

So funktioniert die benutzerdefinierte Dokumentenanreicherung

Der Gesamtprozess der benutzerdefinierten Dokumentenanreicherung sieht wie folgt aus:

  1. Sie konfigurieren die benutzerdefinierte Dokumentenanreicherung, wenn Sie Ihre Datenquelle erstellen oder aktualisieren oder Ihre Dokumente direkt indizieren. Amazon Kendra

  2. Amazon Kendra wendet 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 für die Konfiguration der erweiterten Datenmanipulation entscheiden, Amazon Kendra können Sie diese 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 in diesem Prozess nicht gültig ist, wird ein Amazon Kendra Fehler ausgegeben.

Wenn Sie, oder BatchPutDocumentAPIsaufrufen CreateDataSourceUpdateDataSource, geben Sie Ihre Custom Document Enrichment-Konfiguration an. Wenn Sie anrufenBatchPutDocument, müssen Sie bei jeder Anfrage Custom Document Enrichment 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 Basisoperationen oder nur Lambda-Funktionen oder beides konfigurieren möchten, wie Sie das verwenden können. API Sie können in den Konsolenschritten Weiter auswählen, um festzulegen, dass keine grundlegenden Operationen und nur Lambda-Funktionen konfiguriert werden sollen, einschließlich der Frage, ob sie auf die Originaldaten (vor der Extraktion) oder auf die strukturierten 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 ausführen.

Grundlegende Operationen zum Ändern von Metadaten

Sie können Ihre Dokumentfelder und Inhalte mithilfe grundlegender Logik bearbeiten. 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. Für fortgeschrittene Manipulationen, die über das hinausgehen, was Sie mit grundlegender Logik manipulieren können, rufen Sie 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 Objekts manipulieren möchten. DocumentAttributeTarget Sie geben den Attributschlüssel an. Der Schlüssel „Abteilung“ ist beispielsweise ein Feld oder ein Attribut, das alle Abteilungsnamen enthält, die mit den Dokumenten verknüpft 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 „Quelle_URI“ beispielsweise den URI Wert „Finanzen“ enthält, füllen Sie das Zielfeld „Abteilung“ 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 aus und wählen Sie dann im Navigationsmenü die Option Dokumentanreicherungen aus. Gehen Sie zu Grundoperationen konfigurieren, um grundlegende Änderungen auf Ihre Dokumentfelder und Inhalte anzuwenden.

Im Folgenden finden Sie ein Beispiel dafür, wie mithilfe von Basislogik alle Kundenidentifikationsnummern aus dem Dokumentfeld „Customer_ID“ entfernt werden.

Beispiel 1: Entfernen von Kundenidentifikationsnummern, die den Dokumenten zugeordnet sind

Daten vor der grundlegenden Manipulation angewendet.

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

Daten wurden nach der grundlegenden Manipulation angewendet.

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

Im Folgenden finden Sie ein Beispiel für die Erstellung eines Felds mit dem Namen „Abteilung“ mithilfe von Basislogik. Dieses Feld wird anhand der Informationen aus dem Feld „URIQuelle_“ automatisch mit den Namen der Abteilungen gefüllt. Dabei wird die Bedingung verwendet, dass, wenn das Feld „Quelle_URI“ den URI Wert „Finanzen“ enthält, das Zielfeld „Abteilung“ mit dem Zielwert „Finanzen“ für das Dokument vorab gefüllt wird.

Beispiel 2: Erstellen Sie das Feld „Abteilung“ und füllen Sie es vorab mit den Abteilungsnamen aus, die mit den Dokumenten verknüpft sind, wobei eine Bedingung verwendet wird.

Daten vor der grundlegenden Bearbeitung angewendet.

Dokument-ID Haupttext Quelle_ URI
1 Lorem Ipsum. finanzierlich/1
2 Lorem Ipsum. finanzierlich/2
3 Lorem Ipsum. finanziell/3

Daten wurden nach der grundlegenden Manipulation angewendet.

Dokument-ID Haupttext Quelle_ URI Abteilung
1 Lorem Ipsum. finanzierlich/1 Finanzen
2 Lorem Ipsum. finanzierlich/2 Finanzen
3 Lorem Ipsum. finanziell/3 Finanzen
Anmerkung

Amazon Kendra kann kein Zieldokumentfeld erstellen, wenn es nicht bereits als Indexfeld erstellt wurde. Nachdem Sie Ihr Indexfeld erstellt haben, können Sie mithilfe von ein Dokumentfeld erstellenDocumentAttributeTarget. Amazon Kendra ordnet dann Ihr neu erstelltes Dokument-Metadatenfeld Ihrem Indexfeld zu.

Der folgende Code ist ein Beispiel für die Konfiguration grundlegender Datenmanipulationen, um Kundenidentifikationsnummern zu entfernen, die den Dokumenten zugeordnet sind.

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 „Grundoperationen konfigurieren“ aus der Dropdownliste Ihre Datenquelle aus, für die Sie die Dokumentfelder und den Inhalt ändern möchten. Wählen Sie dann aus der Dropdownliste den Dokumentfeldnamen „Customer_ID“, wählen Sie aus der Drop-down-Liste den Indexfeldnamen „Customer_ID“ und wählen Sie aus der Drop-down-Liste die Zielaktion Löschen aus. Wählen Sie dann Basisvorgang hinzufügen aus.

CLI

Um die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern 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 '{"InlineConfigurations":[{"Target":{"TargetDocumentAttributeKey":"Customer_ID", "TargetDocumentAttributeValueDeletion": true}}]}'
Python

Um die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern 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 = {"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

Um die grundlegende Datenmanipulation zum Entfernen von Kundenidentifikationsnummern 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() .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 dort ein, wo 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 Kendra kann eine Lambda-Funktion aufrufen, um erweiterte Datenmanipulationen während des Aufnahmeprozesses als Teil Ihres anzuwenden. 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 IAM zu speichern — siehe Zugriffsrollen.

Amazon Kendra kann 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 anwendet. PreExtractionHookConfiguration Sie können auch eine Lambda-Funktion konfigurieren, die Ihre strukturierten Dokumente verwendet und Ihre Datenmanipulationen mithilfe von anwendet. PostExtractionHookConfiguration Amazon Kendra extrahiert die Metadaten und den Text des Dokuments, um Ihre Dokumente zu strukturieren. Ihre Lambda-Funktionen müssen den obligatorischen Anforderungs- 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 Dokumentenanreicherungen aus. Gehen Sie zu Lambda-Funktionen konfigurieren, um eine Lambda-Funktion zu konfigurieren.

Sie können nur eine Lambda-Funktion für PreExtractionHookConfiguration und 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 PreExtractionHookConfiguration und PostExtractionHookConfiguration oder eine von beiden konfigurieren. 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 naturgemäß länger, bis Ihre Dokumente aufgenommen werden, Amazon Kendra als wenn Sie dies nicht konfigurieren würden.

Sie können so konfigurieren Amazon Kendra , dass eine Lambda-Funktion nur aufgerufen wird, wenn eine Bedingung erfüllt ist. Sie können beispielsweise eine Bedingung angeben, die besagt, dass, wenn leere Datums-/Uhrzeitwerte vorhanden sind, eine Funktion aufgerufen werden Amazon Kendra soll, die die aktuelle Datums-/Uhrzeitangabe einfügt.

Im Folgenden finden Sie ein Beispiel für die Verwendung einer Lambda-Funktion, die ausgeführt wird, um Text aus Bildern OCR zu interpretieren und diesen Text in einem Feld namens „Document_Image_Text“ zu speichern.

Beispiel 1: Extrahieren von Text aus Bildern, um Textdokumente zu erstellen

Daten vor der fortgeschrittenen Bearbeitung wurden angewendet.

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

Daten wurden nach fortgeschrittener Manipulation angewendet.

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

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

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

Daten vor der erweiterten Bearbeitung wurden angewendet.

Dokument-ID Haupttext Letztes_aktualisiert
1 Lorem Ipsum. 1. Januar 2020
2 Lorem Ipsum.
3 Lorem Ipsum. 1. Juli 2020

Daten wurden nach fortgeschrittener Manipulation angewendet.

Dokument-ID Haupttext Letztes_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 erweiterte Datenmanipulation an den rohen Originaldaten.

Console
So konfigurieren Sie eine Lambda-Funktion für erweiterte Datenmanipulation an den rohen Originaldaten
  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 für Pre-Extraktion aus den Drop-down-Menüs Ihre Lambda-Funktion und Ihren Bucket aus. ARN Amazon S3 Fügen Sie Ihre IAM Zugriffsrolle hinzu, indem Sie in der Dropdownliste die Option zum Erstellen einer neuen Rolle auswählen. Dadurch werden die erforderlichen Amazon Kendra Berechtigungen für die Erstellung der Dokumentenanreicherung erstellt.

CLI

So konfigurieren Sie eine Lambda-Funktion für erweiterte Datenmanipulation an den rohen Originaldaten

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

So konfigurieren Sie eine Lambda-Funktion für erweiterte Datenmanipulation an den rohen Originaldaten

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

So konfigurieren Sie eine Lambda-Funktion für erweiterte Datenmanipulation an den rohen Originaldaten

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 obligatorischen Anforderungs- 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, zu der auch die CustomDocumentAttribute Struktur gehört, 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 unter angegebenen Format entsprechenStrukturiertes Dokumentformat.

Strukturiertes Dokumentformat

Amazon Kendra lä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 Manipulation der Metadatenfelder und des _authors _document_title Hauptinhalts in den Roh- oder Originaldokumenten anwendet.

Im Fall, dass sich der Hauptinhalt in einem Bucket befindet 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"]}} ] }

Im Fall des Hauptinhalts, der sich 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 erweiterte Manipulation der Metadatenfelder und des _authors _document_title Textinhalts in den strukturierten oder geparsten Dokumenten 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"]}} ] }