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

Tablestore:Tablestore SDK の使用

最終更新日:Dec 28, 2024

業務オペレーション中に、非プライマリキー列に基づくクエリやブール型クエリなどのクエリを実行する場合、Tablestore コンソールでデータテーブルの検索インデックスを作成し、その検索インデックスを使用してデータのクエリと分析を行うことができます。

前提条件

  • データテーブルが作成されます。データテーブルの最大バージョンパラメータは 1 に設定されています。データテーブルの有効期限パラメータは、次のいずれかの条件を満たしています。詳細については、データテーブルの操作 を参照してください。

    • データテーブルの有効期限 (TTL) は -1 に設定されています。これは、データテーブル内のデータが期限切れにならないことを示します。

    • データテーブルの TTL は -1 以外の値に設定されており、更新を許可 パラメータは いいえ に設定されています。これは、データテーブルでの更新操作が無効になっていることを示します。

  • OTSClient インスタンスが初期化されます。詳細については、OTSClient インスタンスの初期化 を参照してください。

使用上の注意

  • 検索インデックスのフィールドのデータ型は、検索インデックスが作成されるデータテーブルのフィールドのデータ型と一致する必要があります。詳細については、基本データ型のマッピング を参照してください。

  • 検索インデックスの TTL を -1 以外の値に設定する場合は、検索インデックスが作成されるデータテーブルで UpdateRow 操作が禁止されていることを確認してください。データテーブルに対して作成された検索インデックスの TTL は、データテーブルの TTL 以下である必要があります。詳細については、検索インデックスの TTL の指定 を参照してください。

Tablestore SDK の使用

以下の Tablestore SDK を使用して、TimeSeries モデルを使い始めることができます。この例では、Tablestore SDK for Java を使用して、検索インデックスの使用方法を説明します。

ステップ 1: 検索インデックスを作成する

検索インデックスを作成して、データクエリの速度を向上させることができます。検索インデックスを作成する際には、クエリ対象のデータを持つフィールドを検索インデックスに追加する必要があります。検索インデックスの TTL や事前ソート設定などの詳細設定を行うことができます。

デフォルト設定を使用して検索インデックスを作成する

次のサンプルコードは、デフォルト設定を使用して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、キーワード型の Col_Keyword フィールド、ロング型の Col_Long フィールド、およびベクトル型の Col_Vector フィールドで構成されています。検索インデックスのデータは、データテーブルのプライマリキーに基づいて事前ソートされ、期限切れになりません。

private static void createSearchIndex(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブルの名前を指定します。
    request.setTableName("<TABLE_NAME>"); 
    // 検索インデックスの名前を指定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            // フィールドの名前と型を指定します。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG),
            // ベクトルの型を指定します。
            new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
                    // 次元数を 4 に設定し、ベクトルの距離測定アルゴリズムをドット積アルゴリズムに設定します。
                    .setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
    ));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して検索インデックスを作成します。
    client.createSearchIndex(request); 
}

検索インデックスを作成するときに事前ソート設定を行う

次のサンプルコードは、indexSort パラメータを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、キーワード型の Col_Keyword フィールド、ロング型の Col_Long フィールド、テキスト型の Col_Text フィールド、およびロング型の Timestamp フィールドで構成されています。検索インデックスのデータは、Timestamp フィールドに基づいて事前ソートされます。

private static void createSearchIndexWithIndexSort(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブルの名前を指定します。
    request.setTableName("<TABLE_NAME>"); 
    // 検索インデックスの名前を指定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("Col_Keyword", FieldType.KEYWORD),
            new FieldSchema("Col_Long", FieldType.LONG),
            new FieldSchema("Col_Text", FieldType.TEXT),
            new FieldSchema("Timestamp", FieldType.LONG)
                    .setEnableSortAndAgg(true)));
    // Timestamp フィールドに基づいてデータを事前ソートします。
    indexSchema.setIndexSort(new Sort(
            Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して検索インデックスを作成します。
    client.createSearchIndex(request);
}

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

重要

検索インデックスの TTL 機能は、検索インデックスが作成されるデータテーブルの UpdateRow 操作と相互に排他的です。検索インデックスの TTL を指定する前に、検索インデックスが作成されるデータテーブルの 更新を許可 パラメータが いいえ に設定されていることを確認してください。

次のサンプルコードは、TTL を指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、キーワード型の Col_Keyword フィールドとロング型の Col_Long フィールドで構成されています。検索インデックスの TTL は 7 日間です。

// 検索インデックスを作成するには、Tablestore SDK for Java V5.12.0 以降を使用してください。
public static void createIndexWithTTL(SyncClient client) {
    int days = 7;
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブルの名前を指定します。
    request.setTableName("<TABLE_NAME>");
    // 検索インデックスの名前を指定します。
    request.setIndexName("<SEARCH_INDEX_NAME>");
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            // フィールドの名前と型を指定します。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG)));
    request.setIndexSchema(indexSchema);
    // 検索インデックスの TTL を指定します。
    request.setTimeToLiveInDays(days);
    // クライアントを呼び出して検索インデックスを作成します。
    client.createSearchIndex(request);
}

ステップ 2: 検索インデックスを使用してデータのクエリを実行する

検索インデックスを使用してデータのクエリを実行する場合は、ビジネス要件に基づいてクエリタイプを選択できます。返す列と、返されるデータのソート方法を設定できます。

検索インデックスは、Tablestore SDK を使用して、次のクエリタイプをサポートしています。すべて一致クエリ、用語クエリ、範囲クエリ、プレフィックスクエリ、一致クエリ、ワイルドカードクエリ、一致フレーズクエリ、存在クエリ、用語クエリ、ブール型クエリ、地理フィールドに対する地理クエリ、およびネストされたフィールドに対するネストされたクエリ。地理クエリは、地理的距離クエリ、地理的境界ボックスクエリ、および地理的多角形クエリに分類されます。

クエリタイプ

クエリ

説明

すべて一致クエリ

MatchAllQuery

このクエリは、データテーブルの行の総数をクエリしたり、データテーブルから複数の行をランダムに取得したりするために使用されます。

用語クエリ

TermQuery

このクエリは、完全一致を使用してデータテーブルからデータを取得します。用語クエリは、特定の文字列に基づくクエリに似ています。

TEXT 型の列がクエリされ、行内のいずれかのトークンが指定されたキーワードと完全に一致する場合、その行はクエリ条件を満たします。

範囲クエリ

RangeQuery

このクエリは、指定された範囲内のデータをデータテーブルから取得します。

TEXT 型の列がクエリされ、行内のいずれかのトークンが指定された範囲内にある場合、その行はクエリ条件を満たします。

プレフィックスクエリ

PrefixQuery

このクエリは、指定されたプレフィックスを含むデータをデータテーブルから取得します。

TEXT 型の列がクエリされ、行内のいずれかのトークンが指定されたプレフィックスを含む場合、その行はクエリ条件を満たします。

一致クエリ

MatchQuery

このクエリは、あいまい一致を使用してデータテーブルからデータを取得します。一致クエリに使用するキーワードと列の値は、指定したアナライザーに基づいてトークン化されます。次に、トークンに基づいて一致クエリが実行されます。

OR 論理演算子は、トークンを関連付けるために使用されます。行内のトークンとトークン化されたキーワード内のトークンが一致する数が指定した最小値に達すると、その行はクエリ条件を満たします。

ワイルドカードクエリ

WildcardQuery

このクエリは、データが 1 つ以上のワイルドカード文字を含む文字列と一致する場合、データテーブルからデータを取得します。

文字列でアスタリスク (*) と疑問符 (?) のワイルドカード文字を使用できます。アスタリスク (*) は、クエリ対象の用語の前、後、または途中に任意の長さの文字列と一致します。疑問符 (?) は、特定の位置にある単一の文字と一致します。

一致フレーズクエリ

MatchPhraseQuery

このクエリは、一致クエリに似ています。行内のトークンの順序と位置が、トークン化されたキーワードに含まれるトークンの順序と位置と一致する場合にのみ、行はクエリ条件を満たします。

存在クエリ

ExistQuery

このクエリは、NULL クエリまたは NULL 値クエリとも呼ばれます。このクエリは、スパースデータに使用され、行の列が存在するかどうかを判断します。たとえば、住所列の値が空でない行をクエリできます。

列が行に存在しない場合、または列の値が空の配列 ("[]") である場合、その列は行に存在しません。

用語クエリ

TermsQuery

このクエリは、一度に複数のキーワードを指定できることを除いて、用語クエリに似ています。行内のいずれかのトークンがいずれかのキーワードと一致する場合、その行はクエリ条件を満たします。

ブール型クエリ

BoolQuery

このクエリは、1 つ以上のサブクエリに基づいてデータを取得します。Tablestore は、サブクエリの条件を満たす行を返します。

サブクエリの条件は、AND、NOT、OR などの論理演算子を使用して組み合わせることができます。

地理的距離クエリ

GeoDistanceQuery

中心点と半径で構成される円形の地理的領域をクエリ条件として指定できます。Tablestore は、指定された列の値が円形の地理的領域内にある行を返します。

地理的境界ボックスクエリ

GeoBoundingBoxQuery

矩形の地理的領域をクエリ条件として指定できます。Tablestore は、指定された列の値が矩形の地理的領域内にある行を返します。

地理的多角形クエリ

GeoPolygonQuery

多角形の地理的領域をクエリ条件として指定できます。Tablestore は、指定された列の値が多角形の地理的領域内にある行を返します。

ネストされたクエリ

NestedQuery

このクエリは、ネストされたフィールドのデータを取得します。

ステップ 3: 検索インデックスを使用してデータ分析を行う

データテーブルのデータを分析する場合は、Search 操作を呼び出して集計機能を使用できます。たとえば、集計機能を使用して、最大値、値の合計、行数をクエリしたり、フィールド値でデータをグループ化したりできます。詳細については、集計 を参照してください。

ステップ 4: 検索インデックスを使用してデータをエクスポートする

行をソートせずにクエリ条件を満たすすべての行を取得する場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャン を参照してください。

付録: 検索インデックスの管理

このセクションでは、作成された検索インデックスに対して実行できる操作について説明します。

検索インデックスの詳細をクエリする

次のサンプルコードは、有効期限 (TTL)、作成時刻、同期ステータス、フィールド情報など、検索インデックスの詳細をクエリする方法の例を示しています。

private static DescribeSearchIndexResponse describeSearchIndex(SyncClient client) {
    DescribeSearchIndexRequest request = new DescribeSearchIndexRequest();
    // データテーブルの名前を指定します。
    request.setTableName("<TABLE_NAME>"); 
    // 検索インデックスの名前を指定します。
    request.setIndexName("<INDEX_NAME>"); 
    DescribeSearchIndexResponse response = client.describeSearchIndex(request);
    // レスポンスの詳細を表示します。
    System.out.println(response.jsonize()); 
    // 検索インデックス内のデータの同期ステータスを表示します。
    System.out.println(response.getSyncStat().getSyncPhase().name());
    return response;
}

検索インデックスのリストをクエリする

次のサンプルコードは、テーブルに作成された検索インデックスをリストする方法の例を示しています。

private static List<SearchIndexInfo> listSearchIndex(SyncClient client) {
    ListSearchIndexRequest request = new ListSearchIndexRequest();
    // データテーブルの名前を指定します。
    request.setTableName("<TABLE_NAME>"); 
    // データテーブルに作成されたすべての検索インデックスをクエリします。
    return client.listSearchIndex(request).getIndexInfos();
}

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

検索インデックスを削除する

private static void deleteSearchIndex(SyncClient client) {
    DeleteSearchIndexRequest request = new DeleteSearchIndexRequest();
    request.setTableName("<TABLE_NAME>"); // データテーブルの名前を指定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); // 検索インデックスの名前を指定します。
    client.deleteSearchIndex(request); // クライアントを呼び出して検索インデックスを削除します。
}

FAQ

参考資料

  • Tablestore コンソールまたは Tablestore CLI で検索インデックスを使用することもできます。詳細については、Tablestore コンソールでの検索インデックスの使用 または Tablestore CLI の使用 を参照してください。

  • Search 操作を呼び出してデータをクエリする場合は、ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページング を参照してください。

  • Search 操作を呼び出してデータをクエリする場合は、折りたたみ (重複排除) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ (重複排除) を参照してください。

  • 全文検索を実行する場合は、トークン化を実行できるフィールドをトークン化し、適切なクエリメソッドを選択してデータをクエリする必要があります。詳細については、トークン化 を参照してください。

  • 複数の論理関係でデータを保存およびクエリする場合は、データをネストされたフィールドとして保存し、ネストされたクエリを実行してデータをクエリできます。詳細については、ARRAY フィールドタイプとネストされたフィールドタイプ および ネストされたクエリ を参照してください。

  • 指定された期間を超えて検索インデックスに保持されているデータをシステムが自動的に削除するようにするには、検索インデックスの TTL を指定します。詳細については、検索インデックスの TTL の指定 を参照してください。

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

  • データテーブルのストレージスキーマとデータを変更せずに新しいフィールドまたは新しいフィールドタイプのデータをクエリする場合は、仮想列機能を使用します。詳細については、仮想列 を参照してください。