

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# カスタムデータソースコネクタ
<a name="data-source-custom"></a>

Amazon Kendra がまだデータソースコネクタを提供していないリポジトリがある場合は、カスタムデータソースを使用します。Amazon Kendra のデータソースを使用してリポジトリを同期できない場合でも、Amazon Kendra データソースが提供する同じ実行履歴メトリクスを確認できます。これを使用して、Amazon Kendra データソースとカスタムデータソース間で一貫した同期モニタリングエクスペリエンスを作成します。具体的には、カスタムデータソースを使用して、[BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchPutDocument.html) および [BatchDeleteDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchDeleteDocument.html) API を使用して作成したデータソースコネクタの同期メトリクスを確認します。

Amazon Kendra データソースコネクタのトラブルシューティングについては、「[データソースのトラブルシューティング](troubleshooting-data-sources.md)」を参照してください。

カスタムデータソースを作成すると、インデックスを作成するドキュメントの選択方法を完全に制御できます。Amazon Kendra はデータソース同期ジョブのモニタリングに使用できるメトリクス情報のみを提供します。データソースインデックスを決定するクローラを作成し、実行する必要があります。

`Query` 結果のレスポンスに `DocumentTitle` と `DocumentURI` を含めるには、[ドキュメント](https://docs.aws.amazon.com/kendra/latest/APIReference/API_Document.html)オブジェクトを使用してドキュメントのメインタイトルを指定し、[DocumentAttribute](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DocumentAttribute.html) で `_source_uri` を指定する必要があります。

コンソールを使用して、または [CreateDataSource](https://docs.aws.amazon.com/kendra/latest/APIReference/API_CreateDataSource.html) API を使用してカスタムデータソースの識別子を作成します。コンソールを使用するには、データソースに名前を付け、オプションで説明とリソースタグを指定します。データソースが作成されると、データソース ID が表示されます。この ID をコピーして、データソースをインデックスと同期するときに使用します。

![\[Form for specifying data source details, including name, description, and optional tags.\]](http://docs.aws.amazon.com/ja_jp/kendra/latest/dg/images/CustomDataSource.png)


`CreateDataSource` API を使用して、カスタムデータソースを作成することもできます。この API は、データソースを同期するときに使用する ID を返します。`CreateDataSource` API を使用してカスタムデータソースを作成する場合、`Configuration`、`RoleArn` または `Schedule` パラメータは設定できません。これらのパラメータを設定すると、Amazon Kendra は `ValidationException` 例外を返します。

カスタムデータソースを使用するには、Amazon Kendra インデックスの更新を担当するアプリケーションを作成します。アプリケーションは、作成するクローラによって異なります。クローラーはリポジトリ内のドキュメントを読み取り、Amazon Kendra に送信するドキュメントを決定します。アプリケーションでは、以下のステップを実行する必要があります。

1. リポジトリをクロールし、リポジトリ内の追加、更新、または削除されるドキュメントのリストを作成します。

1. [StartDataSourceSyncJob](https://docs.aws.amazon.com/kendra/latest/APIReference/API_StartDataSourceSyncJob.html) API を呼び出して、同期ジョブが開始されていることを通知します。同期しているデータソースを識別するためのデータソース ID を指定します。 Amazon Kendra は、特定の同期ジョブを識別するために実行 ID を返します。

1. [BatchDeleteDocument](https://docs.aws.amazon.com/kendra/latest/APIReference/API_BatchDeleteDocument.html) API を呼び出して、インデックスからドキュメントを削除します。同期しているデータソースと、この更新が関連付けられているジョブを識別するために、データソース ID と実行 ID を指定します。

1. [StopDataSourceSyncJob](https://docs.aws.amazon.com/kendra/latest/APIReference/API_StopDataSourceSyncJob.html) API を呼び出し、同期ジョブの終了を通知します。`StopDataSourceSyncJob` API を呼び出すと、関連付けられた実行 ID は無効になります。

1. インデックスとデータソース識別子を使用して [ListDataSourceSyncJobs](https://docs.aws.amazon.com/kendra/latest/APIReference/API_ListDataSourceSyncJobs.html) API を呼び出し、データソースの同期ジョブを一覧表示し、同期ジョブのメトリクスを表示します。

同期ジョブを終了したら、新しい同期ジョブを開始できます。提出されたすべてのドキュメントがインデックスに追加されるまで期間がある場合があります。`ListDataSourceSyncJobs` API を使用して、同期ジョブのステータスを確認します。同期ジョブに対して返された `Status` が `SYNCING_INDEXING` の場合、一部のドキュメントはまだインデックス作成中です。前のジョブのステータスが `FAILED` または `SUCCEEDED` の場合は、新しい同期ジョブを開始できます。

`StopDataSourceSyncJob` API を呼び出した後、同期ジョブ識別子は、`BatchPutDocument` または `BatchDeleteDocument` API への呼び出には使えません。呼び出しに使用した場合、送信されたすべてのドキュメントは、API からの `FailedDocuments` レスポンスメッセージに返されます。

## 必須属性
<a name="custom-required-attributes"></a>

`BatchPutDocument` API を使用して Amazon Kendra にドキュメントを送信すると、各ドキュメントにはドキュメントが属するデータソースと同期実行を識別するために 2 つの属性が必要です。カスタムデータソースのドキュメントを Amazon Kendra インデックスに正しくマッピングするには、次の 2 つの属性を指定する必要があります。
+ `_data_source_id` - データソースの識別子。これは、コンソールまたは `CreateDataSource` API を使用してデータソースを作成したときに返されます。
+ `_data_source_sync_job_execution_id` - 同期実行の識別子。これは、`StartDataSourceSyncJob` API とのインデックスの同期を開始したときに返されます。

カスタムデータソースを使用してドキュメントのインデックスを作成するために必要な JSON を次に示します。

```
{
    "Documents": [
        {
            "Attributes": [
                {
                    "Key": "_data_source_id",
                    "Value": {
                        "StringValue": "data source identifier"
                    }
                },
                {
                    "Key": "_data_source_sync_job_execution_id",
                    "Value": {
                        "StringValue": "sync job identifier"
                    }
                }
            ],
            "Blob": "document content",
            "ContentType": "content type",
            "Id": "document identifier",
            "Title": "document title"
        }
    ],
    "IndexId": "index identifier",
    "RoleArn": "IAM role ARN"
}
```

`BatchDeleteDocument` API を使用してインデックスからドキュメントを削除すると、`DataSourceSyncJobMetricTarget` パラメータで次の 2 つのフィールドを指定する必要があります。
+ `DataSourceId` - データソースの識別子。これは、コンソールまたは `CreateDataSource` API を使用してデータソースを作成したときに返されます。
+ `DataSourceSyncJobId` - 同期実行の識別子。これは、`StartDataSourceSyncJob` API とのインデックスの同期を開始したときに返されます。

以下は、`BatchDeleteDocument` API を使用してインデックスからドキュメントを削除するのに必要な JSON です。

```
{
    "DataSourceSyncJobMetricTarget": {
        "DataSourceId": "data source identifier",
        "DataSourceSyncJobId": "sync job identifier"
    },
    "DocumentIdList": [
        "document identifier"
    ],
    "IndexId": "index identifier"
}
```

## メトリクスの表示
<a name="custom-metrics"></a>

同期ジョブが終了したら、 [DataSourceSyncJobMetrics](https://docs.aws.amazon.com/kendra/latest/APIReference/API_DataSourceSyncJobMetrics.html) API を使用して、同期ジョブに関連付けられたメトリクスを取得します。これを使用して、カスタムデータソースの同期をモニタリングします。

同じドキュメントを複数回提出する場合、`BatchPutDocument` API、`BatchDeleteDocument` API のいずれかの一部で、ドキュメントが追加と削除の両方で送信された場合、ドキュメントはメトリクスで一度だけカウントされます。
+ `DocumentsAdded` - インデックスに初めて追加されたこの同期ジョブに関連付けられた `BatchPutDocument` API で送信されたドキュメントの数。ドキュメントが同期で複数回追加されるように送信された場合、そのドキュメントはメトリクスで 1 回だけカウントされます。
+ `DocumentsDeleted` - インデックスから削除されたこの同期ジョブに関連付けられた `BatchDeleteDocument` API を使用して送信されたドキュメントの数。ドキュメントが同期で複数回削除されるように送信された場合、そのドキュメントはメトリクスで 1 回だけカウントされます。
+ `DocumentsFailed` - インデックス作成に失敗したこの同期ジョブに関連付けられているドキュメントの数。これらは、Amazon Kendra がインデックス作成のために受け入れましたが、インデックス作成または削除はできなかったドキュメントです。Amazon Kendra によってドキュメントが受け入れられない場合、ドキュメントの識別子は `BatchPutDocument` および `BatchDeleteDocument` API の `FailedDocuments` レスポンスプロパティに返されます。
+ `DocumentsModified` - Amazon Kendra インデックスで変更されたこの同期ジョブに関連付けられた `BatchPutDocument` API を使用して送信された、変更されたドキュメントの数。

Amazon Kendra は、ドキュメントのインデックス作成中に Amazon CloudWatch メトリクスも発行します。詳細については、「[Amazon CloudWatch による Amazon Kendra のモニタリング](https://docs.aws.amazon.com/kendra/latest/dg/cloudwatch-metrics.html)」を参照してください。

Amazon Kendra はカスタムデータソースの `DocumentsScanned` メトリクスを返しません。また、[Amazon Kendra データソースのメトリクス](https://docs.aws.amazon.com/kendra/latest/dg/cloudwatch-metrics.html#cloudwatch-metrics-data-source)ドキュメントに記載されている CloudWatch メトリクスも出力します。

## 詳細
<a name="custom-learn-more"></a>

Amazon Kendra とカスタムデータソースの統合について詳しくは、以下をご覧ください。
+ [Amazon Kendra へのカスタムデータソースの追加](https://aws.amazon.com/blogs/machine-learning/adding-custom-data-sources-to-amazon-kendra/)

# カスタムデータソース (Java)
<a name="custom-java-sample"></a>

以下のコードは、Java を使用したカスタムデータソースの実装の例を示します。プログラムはまずカスタムデータソースを作成し、次に新しく追加されたドキュメントをカスタムデータソースを持つインデックスに同期します。

次のコードは、カスタムデータソースを作成して使用する方法を示しています。アプリケーションでカスタムデータソースを使用している場合は、インデックスをデータソースと同期するたびに新しいデータソースを作成する必要はありません (1 回限りのプロセス)。インデックス ID とデータソース ID を使用してデータを同期します。

```
package com.amazonaws.kendra;

import java.util.concurrent.TimeUnit;
import software.amazon.awssdk.services.kendra.KendraClient;
import csoftware.amazon.awssdk.services.kendra.model.BatchPutDocumentRequest;
import csoftware.amazon.awssdk.services.kendra.model.BatchPutDocumentResponse;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceRequest;
import software.amazon.awssdk.services.kendra.model.CreateDataSourceResponse;
import software.amazon.awssdk.services.kendra.model.DataSourceType;
import software.amazon.awssdk.services.kendra.model.Document;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsRequest;
import software.amazon.awssdk.services.kendra.model.ListDataSourceSyncJobsResponse;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StartDataSourceSyncJobResponse;
import software.amazon.awssdk.services.kendra.model.StopDataSourceSyncJobRequest;
import software.amazon.awssdk.services.kendra.model.StopDataSourceSyncJobResponse;

public class SampleSyncForCustomDataSource {
  public static void main(String[] args) {
    KendraClient kendra = KendraClient.builder().build();

    String myIndexId = "yourIndexId";
    String dataSourceName = "custom data source";
    String dataSourceDescription = "Amazon Kendra custom data source connector"
	
    // Create custom data source
    CreateDataSourceRequest createDataSourceRequest = CreateDataSourceRequest
        .builder()
        .indexId(myIndexId)
        .name(dataSourceName)
        .description(dataSourceDescription)
        .type(DataSourceType.CUSTOM)
        .build();
    	
    CreateDataSourceResponse createDataSourceResponse = kendra.createDataSource(createDataSourceRequest);
    System.out.println(String.format("Response of creating data source: %s", createDataSourceResponse));
	
    // Get the data source ID from createDataSourceResponse
    String dataSourceId = createDataSourceResponse.Id();

    // Wait for the custom data source to become active
    System.out.println(String.format("Waiting for Amazon Kendra to create the data source %s", dataSourceId));
    // You can use the DescribeDataSource API to check the status
    DescribeDataSourceRequest describeDataSourceRequest = DescribeDataSourceRequest
        .builder()
        .indexId(myIndexId)
        .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));
        if (status != DataSourceStatus.CREATING) {
            break;
        }
        
        TimeUnit.SECONDS.sleep(60);
    }
    
    // Start syncing yor data source by calling StartDataSourceSyncJob and providing your index ID 
    // and your custom data source ID
    System.out.println(String.format("Synchronize the data source %s", dataSourceId));
    StartDataSourceSyncJobRequest startDataSourceSyncJobRequest = StartDataSourceSyncJobRequest
        .builder()
        .indexId(myIndexId)
        .id(dataSourceId)
        .build();
    StartDataSourceSyncJobResponse startDataSourceSyncJobResponse = kendra.startDataSourceSyncJob(startDataSourceSyncJobRequest);
    
    // Get the  sync job execution ID from startDataSourceSyncJobResponse
    String executionId = startDataSourceSyncJobResponse.ExecutionId();
	System.out.println(String.format("Waiting for the data source to sync with the index %s for execution ID %s", indexId, startDataSourceSyncJobResponse.executionId()));
    
    // Add 2 documents uploaded to S3 bucket to your index using the BatchPutDocument API
    // The added documents should sync with your custom data source
    Document pollyDoc = Document
        .builder()
        .s3Path(
            S3Path.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("what_is_Amazon_Polly.docx")
            .build())
        .title("What is Amazon Polly?")
        .id("polly_doc_1")
        .build();
    
    Document rekognitionDoc = Document
        .builder()
        .s3Path(
            S3Path.builder()
            .bucket("amzn-s3-demo-bucket")
            .key("what_is_amazon_rekognition.docx")
            .build())
        .title("What is Amazon rekognition?")
        .id("rekognition_doc_1")
        .build();
    
    BatchPutDocumentRequest batchPutDocumentRequest = BatchPutDocumentRequest
        .builder()
        .indexId(myIndexId)
        .documents(pollyDoc, rekognitionDoc)
        .build();
    
    BatchPutDocumentResponse result = kendra.batchPutDocument(batchPutDocumentRequest);
    System.out.println(String.format("BatchPutDocument result: %s", result));
    
    // Once custom data source synced, stop the sync job using the StopDataSourceSyncJob API
    StopDataSourceSyncJobResponse stopDataSourceSyncJobResponse = kendra.stopDataSourceSyncJob(
        StopDataSourceSyncJobRequest()
            .indexId(myIndexId)
            .id(dataSourceId)
    );
	
	// List your sync jobs
    ListDataSourceSyncJobsRequest listDataSourceSyncJobsRequest = ListDataSourceSyncJobsRequest
        .builder()
        .indexId(myIndexId)
        .id(dataSourceId)
        .build();
    
    while (true) {
        ListDataSourceSyncJobsResponse listDataSourceSyncJobsResponse = kendra.listDataSourceSyncJobs(listDataSourceSyncJobsRequest);
        DataSourceSyncJob job = listDataSourceSyncJobsResponse.history().get(0);
        System.out.println(String.format("Status: %s", job.status()));
    }
  }
}
```