すべてのプロダクト
Search
ドキュメントセンター

Tablestore:検索インデックスの TTL を指定する

最終更新日:Dec 28, 2024

Time to Live (TTL) は検索インデックスの属性であり、検索インデックス内のデータの保持期間を指定します。検索インデックスの TTL を指定できます。検索インデックス内のデータが指定された TTL を超える期間保持されると、Tablestore は自動的にデータを削除してストレージ容量を解放し、コストを削減します。

前提条件

使用上の注意

  • 検索インデックスの TTL を指定する前に、検索インデックスが作成されたデータテーブルの UpdateRow 操作を無効にする必要があります。そうしないと、セマンティックの問題が発生する可能性があります。

    指定されたデータテーブルの TTL は属性列に適用され、指定された検索インデックスの TTL は行全体に適用されます。 UpdateRow 操作を呼び出してデータテーブルを更新すると、Tablestore がデータテーブル内のデータをクリアするときに、一部のフィールドの値が削除され、一部のフィールドの値がデータテーブルに保持されます。ただし、データテーブル用に作成された検索インデックス内の行全体は削除されません。その結果、データテーブルと検索インデックスのデータに不整合が生じます。

    データテーブルを更新する必要がある場合は、UpdateRow 操作の代わりに PutRow 操作を呼び出すことができるかどうかを確認してください。

  • 検索インデックスの TTL は -1 または正の int32 に設定できます。単位:秒。 -1 の値は、検索インデックス内のデータが期限切れにならないことを示します。 int32 の最大値は約 68 年に相当します。

  • 検索インデックスの TTL は、検索インデックスが作成されたデータテーブルの TTL とは独立しており、データテーブルの TTL 以下である必要があります。検索インデックスと、検索インデックスが作成されたデータテーブルの TTL を短縮する必要がある場合は、データテーブルの TTL を変更する前に、検索インデックスの TTL を変更する必要があります。

  • Tablestore は毎日、期限切れのデータを検索インデックスから自動的に削除します。期限切れのデータが削除されるまでは、検索インデックス内の期限切れのデータをクエリできます。 Tablestore は、次のサイクルで期限切れのデータを自動的に削除します。

  • データテーブルと検索インデックスの TTL を変更した後、Tablestore は次のサイクルで、データテーブルと検索インデックスから履歴の期限切れデータを自動的に削除します。

手順

  1. データテーブルの UpdateRow 操作を無効にします。

    次のサンプルコードは、データテーブルの UpdateRow 操作を無効にする方法を示しています。

    func disableTableUpdate(client *tablestore.TableStoreClient) {
        request := &tablestore.UpdateTableRequest{
           TableName: "TableName",
           TableOption: &tablestore.TableOption{
              TimeToAlive:               -1,    // データテーブルの TTL にデフォルト値を使用します。デフォルト値は -1 です。
              MaxVersion:                1,     // 最大バージョンのデフォルト値を使用します。デフォルト値は 1 です。
              DeviationCellVersionInSec: 86400, // 最大バージョンオフセットのデフォルト値を使用します。デフォルト値は 86400 です。単位:秒。
              // ビジネス継続性を確保するために、データテーブルの UpdateRow 操作を無効にします。データテーブルの検索インデックスに TTL が設定されている場合、データテーブルの更新を許可することはできません。
              AllowUpdate: proto.Bool(false),
          },
       }
        resp, err := client.UpdateTable(request)
        if err != nil {
           fmt.Println("error :", err)
           return
       }
        fmt.Println("UpdateTable finished, requestId:", resp.ResponseInfo.RequestId)
    }
  2. 検索インデックスの TTL を指定します。

    データテーブルの UpdateRow 操作が無効になったら、検索インデックスの作成時に検索インデックスの TTL を指定するか、既存の検索インデックスの TTL を変更できます。

    検索インデックスの作成時に TTL を指定する

    次のサンプルコードは、検索インデックスを作成する方法を示しています。この例では、検索インデックスは、String 型の col1 列と Long 型の col2 列の 2 つの列で構成されています。検索インデックスの TTL は 7 日間です。

    func createIndexWithTTL(client *tablestore.TableStoreClient) {
        request := &tablestore.CreateSearchIndexRequest{}
        request.TableName = "<TABLE_NAME>"
        request.IndexName = "<SEARCH_INDEX_NAME>"
        schemas := []*tablestore.FieldSchema{}
        field1 := &tablestore.FieldSchema{
            FieldName:        proto.String("col1"), // proto.String メソッドを呼び出して列名を指定します。このメソッドは、文字列ポインタを要求するために使用されます。
            FieldType:        tablestore.FieldType_KEYWORD, // 列の型を指定します。
            Index:            proto.Bool(true),             // 列のインデックス作成を有効にします。
            EnableSortAndAgg: proto.Bool(true),             // 並べ替えと集計を有効にします。
        }
        field2 := &tablestore.FieldSchema{
            FieldName:        proto.String("col2"),
            FieldType:        tablestore.FieldType_LONG,
            Index:            proto.Bool(true),
            EnableSortAndAgg: proto.Bool(true),
        }
        schemas = append(schemas, field1, field2)
        request.IndexSchema = &tablestore.IndexSchema{
            FieldSchemas: schemas, // 検索インデックスに含まれる列を指定します。
        }
        request.TimeToLive = proto.Int32(3600 * 24 * 7) // 検索インデックスの TTL を 7 日間に設定します。
        resp, err := client.CreateSearchIndex(request)
        if err != nil {
           fmt.Println("error :", err)
           return
       }
        fmt.Println("createIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId)
    }

    既存の検索インデックスの TTL を変更する

    次のサンプルコードは、既存の検索インデックスの TTL を 7 日間に設定する方法を示しています。

    func updateIndexWithTTL(client *tablestore.TableStoreClient) {
        request := &tablestore.UpdateSearchIndexRequest{}
        request.TableName = "TableName"
        request.IndexName = "IndexName"
        request.TimeToLive = proto.Int32(3600 * 24 * 7) // 検索インデックスの TTL を 7 日間に設定します。
        resp, err := client.UpdateSearchIndex(request)
        if err != nil {
           fmt.Println("error :", err)
           return
       }
        fmt.Println("updateIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId)
    }
  3. 検索インデックスの TTL は、検索インデックスが作成されたデータテーブルの TTL とは独立しています。データテーブルの TTL 機能を使用する場合は、データテーブルの TTL を指定します。

    次のサンプルコードは、データテーブルの TTL を 7 日間に設定する方法を示しています。

    // データテーブルの TTL を 7 日間に設定します。
    func updateTableTTL(client *tablestore.TableStoreClient) {
        request := &tablestore.UpdateTableRequest{
            TableName: "TableName",
            TableOption: &tablestore.TableOption{
                TimeToAlive:               3600 * 24 * 7, // データテーブルの TTL を 7 日間に設定します。データテーブルの TTL が、データテーブル用に作成された検索インデックスの TTL 以上であることを確認してください。
                MaxVersion:                1,             // 最大バージョンのデフォルト値を使用します。デフォルト値は 1 です。
                DeviationCellVersionInSec: 86400,         // 最大バージョンオフセットのデフォルト値を使用します。デフォルト値は 86400 です。単位:秒。
                // ビジネス継続性を確保するために、データテーブルの UpdateRow 操作を無効にします。データテーブルの検索インデックスに TTL が設定されている場合、データテーブルの更新を許可することはできません。
                AllowUpdate: proto.Bool(false),
            },
        }
        resp, err := client.UpdateTable(request)
        if err != nil {
            fmt.Println("error :", err)
            return
        }
        fmt.Println("UpdateTable finished, requestId:", resp.ResponseInfo.RequestId)
    }

FAQ

データテーブルの TTL を変更するときに [table ttl] must be bigger than or equal search index ttl というエラーメッセージが返された場合はどうすればよいですか?

参照

  • ListSearchIndex 操作を呼び出して、データテーブル用に作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスの一覧表示を参照してください。

  • DescribeSearchIndex 操作を呼び出して、検索インデックスの説明をクエリできます。たとえば、フィールド情報と検索インデックスの設定をクエリできます。詳細については、検索インデックスの説明のクエリを参照してください。

  • 検索インデックスのスキーマを動的に変更して、検索インデックスにインデックス列を追加、更新、または削除できます。詳細については、検索インデックスのスキーマの動的変更を参照してください。

  • 不要になった検索インデックスを削除できます。詳細については、検索インデックスの削除を参照してください。