仮想カラム機能を使用すると、Tablestore のストレージ構造やデータを変更することなく、多次元インデックスのスキーマを変更したり、新しい多次元インデックスを作成したりすることで、新しいフィールドやデータ型をクエリできます。
前提条件
Tablestore クライアントが初期化されていること。詳細については、「Tablestore クライアントの初期化」をご参照ください。
データテーブルが作成されており、次の条件を満たしていること。詳細については、「データテーブルの作成」をご参照ください。
バージョンの最大数が 1 であること。
生存時間 (TTL) が -1 であるか、データテーブルの更新が禁止されていること。
注意事項
仮想カラムは、文字列型と他のデータ型との間の変換をサポートしています。変換ルールについての詳細は、次の表をご参照ください。
データテーブルのフィールドタイプ
仮想カラムのフィールドタイプ
文字列
Keyword (および配列)
FuzzyKeyword (および配列)
Text (および配列)
Long (および配列)
Double (および配列)
Date (および配列)
IP (および配列)
Geo-point (および配列)
Long
Keyword
FuzzyKeyword
Text
Date
Double
Keyword
FuzzyKeyword
Text
仮想カラムは検索文でのみ使用できます。`ColumnsToGet` でカラム値を返すために使用することはできません。カラム値を返すには、仮想カラムがマップされている元のカラムを指定する必要があります。
パラメーター
詳細については、「多次元インデックスの作成」をご参照ください。
例
多次元インデックスを作成する際に仮想カラムを指定します。
次の例では、`Col_Keyword` と `Col_Long` の 2 つのカラムを持つ多次元インデックスを作成します。この例では、データテーブルの `Col_Keyword` カラムにマップされる `Col_Keyword_Virtual_Long` と、データテーブルの `Col_Long` カラムにマップされる `Col_Long_Virtual_Keyword` の 2 つの仮想カラムも作成します。
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_Keyword_Virtual_Long", FieldType.LONG) // フィールドが仮想カラムであるかどうかを指定します。 .setVirtualField(true) // データテーブル内のソースフィールド。 .setSourceFieldName("Col_Keyword"), new FieldSchema("Col_Long", FieldType.LONG), new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD) .setVirtualField(true) .setSourceFieldName("Col_Long"))); request.setIndexSchema(indexSchema); // 多次元インデックスを作成します。 client.createSearchIndex(request); }仮想カラムを使用してデータをクエリします。
次の例では、`Col_Long_Virtual_Keyword` カラムの値が "1000" である行をクエリする方法を示します。クエリは、一致した行の総数とそれらの行のサブセットを返します。
private static void query(SyncClient client) { SearchQuery searchQuery = new SearchQuery(); TermsQuery termsQuery = new TermsQuery(); // クエリタイプを TermsQuery に設定します。 termsQuery.setFieldName("Col_Long_Virtual_Keyword"); // 一致させるフィールドを設定します。 termsQuery.addTerm(ColumnValue.fromString("1000")); // 一致させる値を設定します。 searchQuery.setQuery(termsQuery); searchQuery.setGetTotalCount(true); // 一致した行の総数を返します。 SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery); SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); columnsToGet.setReturnAll(true); // すべてのカラムを返します。仮想カラムは返されません。 searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); System.out.println("TotalCount: " + resp.getTotalCount()); // この応答の行数ではなく、一致した行の総数。 System.out.println("Row: " + resp.getRows()); }
関連ドキュメント
多次元インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:term クエリ、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックスクエリ、範囲クエリ、ワイルドカード検索、ジオクエリ、KNN ベクタークエリ、ブール値クエリ、ネストされたクエリ、および exists クエリ。多次元インデックスを作成した後、多次元インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソートとページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、「ソートとページングの実行」をご参照ください。
折りたたみ (distinct) 機能を使用して、特定カラムに基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されます。詳細については、「折りたたみ (distinct)」をご参照ください。
テーブル内のデータを分析したい場合は、Search 操作を呼び出して集約機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。