仮想カラム機能を使用すると、検索インデックスのスキーマを変更したり、新しいフィールドと新しいタイプのデータに対してクエリを実行する検索インデックスを作成したりできます。Tablestore テーブルのストレージスキーマやデータを変更する必要はありません。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
maxVersions パラメータが 1 に設定されたデータテーブルが作成されていること。データテーブルの timeToLive パラメータは、以下のいずれかの条件を満たしている必要があります。詳細については、データテーブルの作成を参照してください。
データテーブルの timeToLive パラメータが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。
データテーブルの timeToLive パラメータが -1 以外の値に設定されており、データテーブルに対する更新操作が禁止されていること。
注意事項
- 次の表は、仮想カラムとデータテーブルのカラム間のデータ型変換について説明しています。
データテーブルのフィールドタイプ 仮想カラムのフィールドタイプ String KEYWORD および KEYWORD ARRAY String TEXT および TEXT ARRAY String LONG および LONG ARRAY String DOUBLE および DOUBLE ARRAY String GEOPOINT および GEOPOINT ARRAY Long Keyword Long Text Double Keyword Double Text - 仮想カラムはクエリステートメントでのみ使用でき、ColumnsToGet でカラム値を返すために使用することはできません。カラム値を返すには、仮想カラムのソースカラムを返すようにシステムに指定できます。
パラメータ
詳細については、検索インデックスの作成を参照してください。
例
検索インデックスを作成するときに仮想カラムを指定します。
次のサンプルコードは、Col_Keyword カラムと Col_Long カラムで構成される検索インデックスを作成する方法の例を示しています。各カラムには仮想カラムがあります。Col_Keyword_Virtual_Long カラムはデータテーブルの Col_Keyword カラムにマッピングされ、Col_Long_Virtual_Keyword カラムはデータテーブルの Col_Long カラムにマッピングされます。
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); // ReturnAll を true に設定して、仮想カラムを返さずにすべての属性カラムを返します。 searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の合計数を返すように指定します。 System.out.println("Row: " + resp.getRows()); }
参照
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます。用語クエリ、複数用語クエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、地理クエリ、KNNベクトル検索、ブールクエリ、ネストされたクエリ、存在クエリ。検索インデックスを作成した後、検索インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
並べ替え機能とページング機能を使用して、クエリ条件を満たす行を並べ替えたりページングしたりできます。詳細については、並べ替えとページングの実行を参照してください。
折りたたみ(重複排除)機能を使用して、特定のカラムに基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
テーブル内のデータを分析する場合、Search 操作を呼び出して集計機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計とSQL クエリを参照してください。
行を並べ替えることなく、クエリ条件を満たすすべての行を取得する場合、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。