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

Tablestore:仮想カラム

最終更新日:Dec 28, 2024

仮想カラム機能を使用すると、検索インデックスのスキーマを変更したり、新しいフィールドと新しいタイプのデータに対してクエリを実行する検索インデックスを作成したりできます。Tablestore テーブルのストレージスキーマやデータを変更する必要はありません。

前提条件

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

  • maxVersions パラメータが 1 に設定されたデータテーブルが作成されていること。データテーブルの timeToLive パラメータは、以下のいずれかの条件を満たしている必要があります。詳細については、データテーブルの作成を参照してください。

    • データテーブルの timeToLive パラメータが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。

    • データテーブルの timeToLive パラメータが -1 以外の値に設定されており、データテーブルに対する更新操作が禁止されていること。

注意事項

  • 次の表は、仮想カラムとデータテーブルのカラム間のデータ型変換について説明しています。
    データテーブルのフィールドタイプ仮想カラムのフィールドタイプ
    StringKEYWORD および KEYWORD ARRAY
    StringTEXT および TEXT ARRAY
    StringLONG および LONG ARRAY
    StringDOUBLE および DOUBLE ARRAY
    StringGEOPOINT および GEOPOINT ARRAY
    LongKeyword
    LongText
    DoubleKeyword
    DoubleText
  • 仮想カラムはクエリステートメントでのみ使用でき、ColumnsToGet でカラム値を返すために使用することはできません。カラム値を返すには、仮想カラムのソースカラムを返すようにシステムに指定できます。

パラメータ

詳細については、検索インデックスの作成を参照してください。

  1. 検索インデックスを作成するときに仮想カラムを指定します。

    次のサンプルコードは、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); 
    }
  2. 仮想カラムを使用してデータをクエリします。

    次のサンプルコードは、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());
    }

参照