Memperkaya dokumen Anda selama konsumsi - Amazon Kendra

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memperkaya dokumen Anda selama konsumsi

catatan

Dukungan fitur bervariasi menurut jenis indeks dan pencarian API yang digunakan. Untuk melihat apakah fitur ini didukung untuk jenis indeks dan penelusuran yang API Anda gunakan, lihat Jenis indeks.

Anda dapat mengubah bidang atau atribut metadata konten dan dokumen selama proses penyerapan dokumen. Dengan Amazon Kendra fitur Custom Document Enrichment, Anda dapat membuat, memodifikasi, atau menghapus atribut dan konten dokumen saat Anda memasukkan dokumen ke dalamnya. Amazon Kendra Ini berarti Anda dapat memanipulasi dan menelan data Anda sesuai kebutuhan.

Fitur ini memberi Anda kendali atas bagaimana dokumen Anda diperlakukan dan dicerna Amazon Kendra. Misalnya, Anda dapat menggosok informasi yang dapat diidentifikasi secara pribadi dalam metadata dokumen sambil memasukkan dokumen Anda ke dalamnya. Amazon Kendra

Cara lain Anda dapat menggunakan fitur ini adalah dengan menjalankan fungsi AWS Lambda Lambda untuk menjalankan Optical Character Recognition OCR () pada gambar, terjemahan pada teks, dan tugas lain untuk menyiapkan data untuk pencarian atau analisis. Misalnya, Anda dapat memanggil fungsi untuk dijalankan OCR pada gambar. Fungsi ini dapat menafsirkan teks dari gambar dan memperlakukan setiap gambar sebagai dokumen tekstual. Sebuah perusahaan yang menerima survei pelanggan melalui pos dan menyimpan survei ini sebagai gambar dapat menelan gambar-gambar ini sebagai dokumen tekstual ke dalam. Amazon Kendra Perusahaan kemudian dapat mencari informasi survei pelanggan yang berharga di Amazon Kendra.

Anda dapat menggunakan operasi dasar untuk diterapkan sebagai penguraian pertama data Anda, dan kemudian menggunakan fungsi Lambda untuk menerapkan operasi yang lebih kompleks pada data Anda. Misalnya, Anda dapat menggunakan operasi dasar untuk menghapus semua nilai di bidang metadata dokumen 'Customer_ID', dan kemudian menerapkan fungsi Lambda untuk mengekstrak teks dari gambar teks dalam dokumen.

Cara kerja Pengayaan Dokumen Kustom

Keseluruhan proses Pengayaan Dokumen Kustom adalah sebagai berikut:

  1. Anda mengonfigurasi Pengayaan Dokumen Kustom saat membuat atau memperbarui sumber data, atau mengindeks dokumen Anda secara langsung. Amazon Kendra

  2. Amazon Kendra menerapkan konfigurasi inline atau logika dasar untuk mengubah data Anda. Untuk informasi selengkapnya, lihat Operasi dasar untuk mengubah metadata.

  3. Jika Anda memilih untuk mengonfigurasi manipulasi data lanjutan, Amazon Kendra dapat menerapkannya pada dokumen asli, mentah atau pada dokumen terstruktur dan terurai. Untuk informasi selengkapnya, lihat Fungsi Lambda: ekstrak dan ubah metadata atau konten.

  4. Dokumen Anda yang diubah dicerna. Amazon Kendra

Kapan pun dalam proses ini, jika konfigurasi Anda tidak valid, akan Amazon Kendra menimbulkan kesalahan.

Saat Anda menelepon CreateDataSource, UpdateDataSource, atau BatchPutDocumentAPIs, Anda memberikan konfigurasi Pengayaan Dokumen Kustom Anda. Jika Anda meneleponBatchPutDocument, Anda harus mengonfigurasi Pengayaan Dokumen Kustom dengan setiap permintaan. Jika Anda menggunakan konsol, Anda memilih indeks Anda dan kemudian pilih Pengayaan dokumen untuk mengonfigurasi Pengayaan Dokumen Kustom.

Jika Anda menggunakan pengayaan Dokumen di konsol, Anda dapat memilih untuk hanya mengonfigurasi operasi dasar atau hanya fungsi Lambda atau keduanya, seperti yang dapat Anda gunakan. API Anda dapat memilih Berikutnya dalam langkah-langkah konsol untuk memilih untuk tidak mengonfigurasi operasi dasar dan hanya fungsi Lambda, termasuk apakah akan diterapkan ke data asli (pra-ekstraksi) atau terstruktur (pasca-ekstraksi). Anda hanya dapat menyimpan konfigurasi Anda dengan menyelesaikan semua langkah di konsol. Konfigurasi dokumen Anda tidak disimpan jika Anda tidak menyelesaikan semua langkah.

Operasi dasar untuk mengubah metadata

Anda dapat memanipulasi bidang dokumen dan konten menggunakan logika dasar. Ini termasuk menghapus nilai dalam bidang, memodifikasi nilai dalam bidang menggunakan kondisi, atau membuat bidang. Untuk manipulasi lanjutan yang melampaui apa yang dapat Anda manipulasi menggunakan logika dasar, panggil fungsi Lambda. Untuk informasi selengkapnya, lihat Fungsi Lambda: ekstrak dan ubah metadata atau konten.

Untuk menerapkan logika dasar, Anda menentukan bidang target yang ingin Anda manipulasi menggunakan DocumentAttributeTargetobjek. Anda memberikan kunci atribut. Misalnya, kunci 'Departemen' adalah bidang atau atribut yang menyimpan semua nama departemen yang terkait dengan dokumen. Anda juga dapat menentukan nilai yang akan digunakan di bidang target jika kondisi tertentu terpenuhi. Anda mengatur kondisi menggunakan DocumentAttributeConditionobjek. Misalnya, jika bidang 'Sumber_ URI 'berisi' keuangan 'dalam URI nilainya, maka isi terlebih dahulu bidang target' Departemen 'dengan nilai target' Keuangan 'untuk dokumen tersebut. Anda juga dapat menghapus nilai-nilai atribut dokumen target.

Untuk menerapkan logika dasar menggunakan konsol, pilih indeks Anda dan kemudian pilih Pengayaan dokumen di menu navigasi. Buka Konfigurasi operasi dasar untuk menerapkan manipulasi dasar ke bidang dan konten dokumen Anda.

Berikut ini adalah contoh menggunakan logika dasar untuk menghapus semua nomor identifikasi pelanggan di bidang dokumen yang disebut 'Customer_ID'.

Contoh 1: Menghapus nomor identifikasi pelanggan yang terkait dengan dokumen

Data sebelum manipulasi dasar diterapkan.

Dokumen_ID Body_Text ID Pelanggan
1 Lorem Ipsum. CID1234
2 Lorem Ipsum. CID1235
3 Lorem Ipsum. CID1236

Data setelah manipulasi dasar diterapkan.

Dokumen_ID Body_Text ID Pelanggan
1 Lorem Ipsum.
2 Lorem Ipsum.
3 Lorem Ipsum.

Berikut ini adalah contoh penggunaan logika dasar untuk membuat bidang yang disebut 'Departemen' dan isi bidang ini dengan nama departemen berdasarkan informasi dari bidang 'Sumber_ 'URI. Ini menggunakan kondisi bahwa jika bidang 'Sumber_ URI 'berisi' keuangan 'dalam URI nilainya, maka isi terlebih dahulu bidang target' Departemen 'dengan nilai target' Keuangan 'untuk dokumen tersebut.

Contoh 2: Membuat bidang 'Departemen' dan mengisinya dengan nama departemen yang terkait dengan dokumen menggunakan kondisi.

Data sebelum manipulasi dasar diterapkan.

Dokumen_ID Body_Text Sumber_ URI
1 Lorem Ipsum. keuangan/1
2 Lorem Ipsum. keuangan/2
3 Lorem Ipsum. keuangan/3

Data setelah manipulasi dasar diterapkan.

Dokumen_ID Body_Text Sumber_ URI Departemen
1 Lorem Ipsum. keuangan/1 Keuangan
2 Lorem Ipsum. keuangan/2 Keuangan
3 Lorem Ipsum. keuangan/3 Keuangan
catatan

Amazon Kendra tidak dapat membuat bidang dokumen target jika belum dibuat sebagai bidang indeks. Setelah Anda membuat bidang indeks Anda, Anda dapat membuat bidang dokumen menggunakanDocumentAttributeTarget. Amazon Kendra kemudian memetakan bidang metadata dokumen yang baru Anda buat ke bidang indeks Anda.

Kode berikut adalah contoh konfigurasi manipulasi data dasar untuk menghapus nomor identifikasi pelanggan yang terkait dengan dokumen.

Console
Mengkonfigurasi manipulasi data dasar untuk menghapus nomor identifikasi pelanggan
  1. Di panel navigasi kiri, di bawah Indeks, pilih Pengayaan dokumen dan kemudian pilih Tambahkan pengayaan dokumen.

  2. Pada halaman Konfigurasi operasi dasar, pilih dari dropdown sumber data Anda yang ingin Anda ubah bidang dokumen dan konten. Kemudian pilih dari dropdown nama bidang dokumen 'Customer_ID', pilih dari dropdown nama bidang indeks 'Customer_ID', dan pilih dari dropdown tindakan target Hapus. Kemudian pilih Tambahkan operasi dasar.

CLI

Untuk mengkonfigurasi manipulasi data dasar untuk menghapus nomor identifikasi pelanggan

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

Untuk mengkonfigurasi manipulasi data dasar untuk menghapus nomor identifikasi pelanggan

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

Untuk mengkonfigurasi manipulasi data dasar untuk menghapus nomor identifikasi pelanggan

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

Fungsi Lambda: ekstrak dan ubah metadata atau konten

Anda dapat memanipulasi bidang dokumen dan konten menggunakan fungsi Lambda. Ini berguna jika Anda ingin melampaui logika dasar dan menerapkan manipulasi data tingkat lanjut. Misalnya, menggunakan Optical Character Recognition (OCR), yang menafsirkan teks dari gambar, dan memperlakukan setiap gambar sebagai dokumen tekstual. Atau, mengambil tanggal-waktu saat ini di zona waktu tertentu dan memasukkan tanggal-waktu di mana ada nilai kosong untuk bidang tanggal.

Anda dapat menerapkan logika dasar terlebih dahulu dan kemudian menggunakan fungsi Lambda untuk memanipulasi data Anda lebih lanjut, atau sebaliknya. Anda juga dapat memilih untuk hanya menerapkan fungsi Lambda.

Amazon Kendra dapat memanggil fungsi Lambda untuk menerapkan manipulasi data lanjutan selama proses konsumsi sebagai bagian dari Anda. CustomDocumentEnrichmentConfiguration Anda menentukan peran yang menyertakan izin untuk menjalankan fungsi Lambda dan mengakses Amazon S3 bucket untuk menyimpan output manipulasi data IAM Anda—lihat peran akses.

Amazon Kendra dapat menerapkan fungsi Lambda pada dokumen asli Anda, dokumen mentah atau pada dokumen terstruktur dan diuraikan. Anda dapat mengonfigurasi fungsi Lambda yang mengambil data asli atau mentah Anda dan menerapkan manipulasi data Anda menggunakan. PreExtractionHookConfiguration Anda juga dapat mengonfigurasi fungsi Lambda yang mengambil dokumen terstruktur Anda dan menerapkan manipulasi data Anda menggunakan. PostExtractionHookConfiguration Amazon Kendra mengekstrak metadata dokumen dan teks untuk menyusun dokumen Anda. Fungsi Lambda Anda harus mengikuti struktur permintaan dan respons wajib. Untuk informasi selengkapnya, lihat Kontrak data untuk fungsi Lambda.

Untuk mengonfigurasi fungsi Lambda di konsol, pilih indeks Anda dan kemudian pilih Pengayaan dokumen di menu navigasi. Buka Konfigurasi fungsi Lambda untuk mengonfigurasi fungsi Lambda.

Anda hanya dapat mengonfigurasi satu fungsi Lambda untuk PreExtractionHookConfiguration dan dan hanya satu fungsi Lambda untuk. PostExtractionHookConfiguration Namun, fungsi Lambda Anda dapat memanggil fungsi lain yang dibutuhkannya. Anda dapat mengkonfigurasi keduanya PreExtractionHookConfiguration dan PostExtractionHookConfiguration atau salah satunya. Fungsi Lambda Anda untuk tidak PreExtractionHookConfiguration boleh melebihi waktu berjalan 5 menit dan fungsi Lambda Anda untuk PostExtractionHookConfiguration tidak boleh melebihi waktu berjalan 1 menit. Mengkonfigurasi Pengayaan Dokumen Kustom secara alami membutuhkan waktu lebih lama untuk menyerap dokumen Anda Amazon Kendra daripada jika Anda tidak mengonfigurasinya.

Anda dapat mengonfigurasi Amazon Kendra untuk menjalankan fungsi Lambda hanya jika kondisi terpenuhi. Misalnya, Anda dapat menentukan kondisi bahwa jika ada nilai tanggal-waktu kosong, maka Amazon Kendra harus memanggil fungsi yang menyisipkan tanggal-waktu saat ini.

Berikut ini adalah contoh menggunakan fungsi Lambda untuk menjalankan OCR menafsirkan teks dari gambar dan menyimpan teks ini dalam bidang yang disebut 'Document_Image_Text'.

Contoh 1: Mengekstrak teks dari gambar untuk membuat dokumen tekstual

Data sebelum manipulasi lanjutan diterapkan.

Dokumen_ID Document_Image
1 image_1.png
2 image_2.png
3 image_3.png

Data setelah manipulasi lanjutan diterapkan.

Dokumen_ID Document_Image Document_Image_Text
1 image_1.png Tanggapan survei yang dikirim
2 image_2.png Tanggapan survei yang dikirim
3 image_3.png Tanggapan survei yang dikirim

Berikut ini adalah contoh menggunakan fungsi Lambda untuk menyisipkan tanggal-waktu saat ini untuk nilai tanggal kosong. Ini menggunakan kondisi bahwa jika nilai bidang tanggal adalah 'null', maka ganti ini dengan tanggal-waktu saat ini.

Contoh 2: Mengganti nilai kosong di bidang Last_Updated dengan tanggal-waktu saat ini.

Data sebelum manipulasi lanjutan diterapkan.

Dokumen_ID Body_Text Terakhir_Diperbarui
1 Lorem Ipsum. Januari 1, 2020
2 Lorem Ipsum.
3 Lorem Ipsum. 1 Juli 2020

Data setelah manipulasi lanjutan diterapkan.

Dokumen_ID Body_Text Terakhir_Diperbarui
1 Lorem Ipsum. Januari 1, 2020
2 Lorem Ipsum. 1 Desember 2021
3 Lorem Ipsum. 1 Juli 2020

Kode berikut adalah contoh konfigurasi fungsi Lambda untuk manipulasi data lanjutan pada data asli mentah.

Console
Untuk mengonfigurasi fungsi Lambda untuk manipulasi data tingkat lanjut pada data asli mentah
  1. Di panel navigasi kiri, di bawah Indeks, pilih Pengayaan dokumen dan kemudian pilih Tambahkan pengayaan dokumen.

  2. Pada halaman Konfigurasi fungsi Lambda, di bagian Lambda untuk pra-ekstraksi, pilih dari dropdown fungsi Lambda dan bucket Anda. ARN Amazon S3 Tambahkan peran IAM akses Anda dengan memilih opsi untuk membuat peran baru dari dropdown. Ini menciptakan Amazon Kendra izin yang diperlukan untuk membuat pengayaan dokumen.

CLI

Untuk mengonfigurasi fungsi Lambda untuk manipulasi data tingkat lanjut pada data asli mentah

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

Untuk mengonfigurasi fungsi Lambda untuk manipulasi data tingkat lanjut pada data asli mentah

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

Untuk mengonfigurasi fungsi Lambda untuk manipulasi data tingkat lanjut pada data asli mentah

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

Kontrak data untuk fungsi Lambda

Fungsi Lambda Anda untuk manipulasi data tingkat lanjut berinteraksi dengan kontrak Amazon Kendra data. Kontrak adalah struktur permintaan dan respons wajib dari fungsi Lambda Anda. Jika fungsi Lambda Anda tidak mengikuti struktur ini, maka akan Amazon Kendra menimbulkan kesalahan.

Fungsi Lambda Anda untuk PreExtractionHookConfiguration harus mengharapkan struktur permintaan berikut:

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

metadataStruktur, yang meliputi CustomDocumentAttribute struktur, adalah sebagai berikut:

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

Fungsi Lambda Anda untuk PreExtractionHookConfiguration harus mematuhi struktur respons berikut:

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

Fungsi Lambda Anda untuk PostExtractionHookConfiguration harus mengharapkan struktur permintaan berikut:

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

Fungsi Lambda Anda untuk PostExtractionHookConfiguration harus mematuhi struktur respons berikut:

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

Dokumen Anda yang diubah diunggah ke bucket Anda Amazon S3 . Dokumen yang diubah harus mengikuti format yang ditunjukkan. Format dokumen terstruktur

Format dokumen terstruktur

Amazon Kendra mengunggah dokumen terstruktur Anda ke Amazon S3 bucket yang diberikan. Dokumen terstruktur mengikuti format ini:

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

Contoh fungsi Lambda yang mematuhi kontrak data

Kode Python berikut adalah contoh fungsi Lambda yang menerapkan manipulasi lanjutan bidang metadata _authors_document_title, dan isi isi pada dokumen mentah atau asli.

Dalam hal isi tubuh berada dalam ember 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"]}} ] }

Dalam kasus konten tubuh yang berada di gumpalan data

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

Kode Python berikut adalah contoh fungsi Lambda yang menerapkan manipulasi lanjutan dari bidang metadata _authors_document_title, dan isi isi pada dokumen terstruktur atau diurai.

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