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

Tablestore:ルーティングフィールドの使用方法

最終更新日:Jul 17, 2026

検索インデックスを作成する際、1 つ以上のプライマリキー列をルーティングフィールドとして指定できます。インデックスデータが検索インデックスに書き込まれる際、Tablestore はルーティングフィールドの値に基づいてインデックスデータの分散先を決定します。ルーティングフィールドの値が同じ行は、同じパーティションにインデックスされます。

操作手順

  1. 検索インデックスを作成する際に、1 つ以上のルーティングフィールドを指定します。

    検索インデックスの作成時にルーティングフィールドを指定すると、データの読み取りおよび書き込み操作時にインデックスデータの場所を特定するために、これらのルーティングフィールドが使用されます。

    検索インデックスのスキーマを動的に変更することで、検索インデックスのルーティングフィールドを動的に変更できます。たとえば、デフォルトのルーティングフィールドをカスタムルーティングフィールドに変更したり、カスタムルーティングフィールドをデフォルトのルーティングフィールドに変更したりできます。デフォルトのルーティングフィールドはパーティションキーです。詳細については、「検索インデックススキーマの動的変更」をご参照ください。

    重要

    Tablestore のプライマリキー列のみをルーティングフィールドとして指定できます。ほとんどの場合、1 つのルーティングフィールドのみを指定する必要があります。複数のルーティングフィールドを指定した場合、システムはルーティングフィールドの値を連結してルーティングキーとして使用します。

  2. 検索インデックスを使用してデータをクエリする際、クエリリクエストにルーティングフィールドを指定します。

    Tablestore は、クエリリクエストで指定されたルーティングフィールドに基づいて、特定のパーティションのみをスキャンします。これにより、Tablestore がスキャンするパーティションが絞り込まれるため、クエリレイテンシーが削減されます。検索インデックスにルーティングフィールドを指定した場合、検索インデックスを使用してデータをクエリする際にルーティングフィールドを指定する必要があります。検索インデックスにルーティングフィールドを指定しても、検索インデックスを使用したデータクエリの結果には影響しません。ただし、ルーティングフィールドを指定しない場合、Tablestore は無関係なパーティションもスキャンします。これによりシステムリソースが無駄になり、クエリレイテンシーが増加します。

    重要

    ルーティングフィールドには 1 つ以上の値を指定できます。ただし、ルーティングフィールドの値の範囲を指定することはできません。

方法

Tablestore コンソール、Tablestore CLI、または Tablestore SDK を使用してルーティングフィールドを指定できます。検索インデックスの作成時にルーティングフィールドを指定することも、既存の検索インデックスのルーティングフィールドを変更することもできます。このセクションでは、検索インデックスの作成時にルーティングフィールドを指定する方法の例を示します。検索インデックスのルーティングフィールドを指定する前に、以下の前提条件を満たす必要があります。

説明

検索インデックスを作成した後、検索インデックスのスキーマを変更することで、検索インデックスのルーティングフィールドを変更できます。詳細については、「検索インデックススキーマの動的変更」をご参照ください。

  • 次の条件を同時に満たすデータテーブルが作成されていること。

    • データテーブルの最大バージョン数パラメータが 1 に設定されていること。

    • データテーブルの生存時間 (TTL) が -1 に設定されているか、データテーブルに対する更新操作が禁止されていること。

  • Tablestore SDK を使用してルーティングフィールドを指定する場合は、クライアントが初期化されていること。詳細については、「Tablestoreクライアントの初期化」をご参照ください。

  • Tablestore CLI を使用してルーティングフィールドを指定する場合は、Tablestore CLI がインストールおよび起動されており、アクセスするインスタンスに関する情報が設定されていること。詳細については、「Tablestore CLIのダウンロード」および「Tablestore CLIの起動とアクセス情報の設定」をご参照ください。

Tablestoreコンソールの使用

Tablestore コンソールで検索インデックスを作成時に、[詳細設定]をオンにしてルーティングフィールドを指定します。 詳細については、「クイックスタート」をご参照ください。

[テーブル名] を order に、[インデックス名] を order_index に設定します。[スキーマ生成] を [自動生成] に設定します。インデックスフィールドには、user_id (String)、product_nan (String)、および order_time (Long) が含まれます。[ルーティングキー] を user_id に、[データライフサイクル] を -1 に、[事前ソート] を [デフォルトソート] に設定します。

Tablestore CLIの使用

Tablestore CLI を使用して create_search_index コマンドを実行し、検索インデックスを作成できます。詳細については、「検索インデックス」をご参照ください。

  1. 検索インデックスを作成する際にルーティングフィールドを指定します。

    次のサンプルコードは、mysearchindex という名前の検索インデックスを作成する方法の例を示しています。この検索インデックスには、LONG 型の gid フィールド、LONG 型の uid フィールド、LONG 型の col2 フィールド、TEXT 型の col3 フィールド、KEYWORD 型の col1 フィールド、LONG 型の col3V フィールドが含まれます。col3V フィールドは、データテーブルの col3 列に対応する仮想カラムです。この例では、検索インデックスのルーティングフィールドは uid フィールドです。

    create_search_index -n mysearchindex

    プロンプトの指示に従って、検索インデックスのスキーマを指定します。検索インデックスを使用してデータをクエリする前に、ビジネス要件に基づいてサンプルコード内のフィールド設定を変更する必要があります。サンプルコード:

    {
    
        "IndexSetting": {
            "RoutingFields": ["uid"]
        },
        "FieldSchemas": [
        {
            "FieldName": "gid",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "uid",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col2",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col3",
            "FieldType": "TEXT",
            "Index": true,
            "Analyzer": "single_word",
            "AnalyzerParameter": {
            "CaseSensitive": true,
                "DelimitWord": null
            },
            "EnableSortAndAgg": false,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col1",
            "FieldType": "KEYWORD",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": false
        },
        {
            "FieldName": "col3V",
            "FieldType": "LONG",
            "Index": true,
            "EnableSortAndAgg": true,
            "Store": true,
            "IsArray": false,
            "IsVirtualField": true,
            "SourceFieldNames": [
            "col3"
            ]
        }]
    }
  2. 検索インデックスを使用してデータをクエリする際に、ルーティングフィールドを指定します。

    次のサンプルコードは、検索インデックス「mysearchindex」を使用して、col2 列の値が 200 未満の行をクエリする方法の例を示しています。データをクエリする際には、検索インデックスのルーティングフィールドを指定する必要があります。この例では、ルーティングフィールドは uid フィールドです。

    search -n mysearchindex --return_all_indexed

    プロンプトの指示に従って、クエリ条件を指定します。検索インデックスを使用してデータをクエリする前に、ビジネス要件に基づいてサンプルコード内のクエリ条件を変更する必要があります。サンプルコード:

    説明

    この例では、範囲クエリ方式を使用しています。検索インデックス機能でサポートされているクエリ方式については、「基本機能」をご参照ください。

    {
        "Offset": -1,
        "Limit": 10,
        "Collapse": null,
        "Sort": null,
        "GetTotalCount": true,
        "Token": null,
        "Query": {
            "Name": "RangeQuery",
            "Query": {
                "FieldName": "col2",
                "From": null,
                "To": 200,
                "IncludeLower": false,
                "IncludeUpper": false
             }
         }
    }

Tablestore SDKの使用

検索インデックスを作成する際にルーティングフィールドを指定するには、次の Tablestore SDK を使用できます。Tablestore SDK for Java、Tablestore SDK for Go、Tablestore SDK for Python、Tablestore SDK for Node.js、Tablestore SDK for .NET、Tablestore SDK for PHP。この例では、Tablestore SDK for Java を使用してルーティングフィールドの指定方法と使用方法を説明します。

次のサンプルコードは、order という名前のデータテーブルを作成し、order_index という名前の検索インデックスを作成して、ルーティングフィールドを user_id フィールドに設定し、データテーブルにデータを書き込み、クエリリクエストでルーティングフィールドを指定する方法の例を示しています。この例では、データテーブルには STRING 型の order_id プライマリキー列と STRING 型の user_id プライマリキー列が含まれます。検索インデックスには、KEYWORD 型の product_name フィールド、LONG 型の order_time フィールド、KEYWORD 型の user_id フィールドが含まれます。

private static void testRoute(SyncClient client) throws InterruptedException {
    // テーブルを作成します。
    TableMeta meta = new TableMeta("order");
    meta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING);
    meta.addPrimaryKeyColumn("user_id",PrimaryKeyType.STRING);
    TableOptions options = new TableOptions();
    options.setMaxVersions(1);
    options.setTimeToLive(-1);
    CreateTableRequest request = new CreateTableRequest(meta,options);
    request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0)));
    CreateTableResponse response = client.createTable(request);

    // 検索インデックスを作成し、ルーティングフィールドを指定します。
    CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
    // データテーブルの名前を指定します。
    searchIndexRequest.setTableName("order"); 
    // データテーブルに対して作成する検索インデックスの名前を指定します。
    searchIndexRequest.setIndexName("order_index"); 
    IndexSchema indexSchema = new IndexSchema();
    IndexSetting indexSetting = new IndexSetting();
    // ルーティングフィールドを user_id フィールドに設定します。
    indexSetting.setRoutingFields(Arrays.asList("user_id"));
    indexSchema.setIndexSetting(indexSetting);

    // インデックスフィールドを追加します。次のインデックスフィールドは参考用です。ビジネス要件に基づいてインデックスフィールドを追加できます。
    indexSchema.setFieldSchemas(Arrays.asList(
        new FieldSchema("product_name",FieldType.KEYWORD).setStore(true).setIndex(true),
        new FieldSchema("order_time",FieldType.LONG).setStore(true).setEnableSortAndAgg(true).setIndex(true),
        new FieldSchema("user_id",FieldType.KEYWORD).setStore(true).setIndex(true)
    ));

    searchIndexRequest.setIndexSchema(indexSchema);
    client.createSearchIndex(searchIndexRequest);
    // データテーブルが読み込まれるまで待機します。
    Thread.sleep(6*1000); 

    // テスト用のデータを挿入します。

    String[] productName = new String[]{"product a", "product b", "product c"};
    String[] userId = new String[]{"00001", "00002", "00003", "00004", "00005"};
    for (int i = 0; i < 100; i++){

      PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
      primaryKeyBuilder.addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString(i+""));
      primaryKeyBuilder.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString(userId[i%(userId.length)]));
      PrimaryKey primaryKey = primaryKeyBuilder.build();

      RowPutChange rowPutChange = new RowPutChange("order",primaryKey);

      // 属性列にデータを書き込みます。
      rowPutChange.addColumn("product_name",ColumnValue.fromString(productName[i%(productName.length)]));
      rowPutChange.addColumn("order_time",ColumnValue.fromLong(System.currentTimeMillis()));
      rowPutChange.setCondition(new Condition(RowExistenceExpectation.IGNORE));

      client.putRow(new PutRowRequest(rowPutChange));

    }
    // データが検索インデックスに同期されるまで待機します。
    Thread.sleep(20*1000);

    // クエリリクエストでルーティングフィールドを指定します。
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.setTableName("order");
    searchRequest.setIndexName("order_index");
    MatchQuery matchQuery = new MatchQuery();
    matchQuery.setFieldName("user_id");
    matchQuery.setText("00002");
    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(matchQuery);
    searchQuery.setGetTotalCount(true);

    SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    columnsToGet.setReturnAll(true);
    searchRequest.setColumnsToGet(columnsToGet);
    searchRequest.setSearchQuery(searchQuery);

    PrimaryKeyBuilder pkbuild = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pkbuild.addPrimaryKeyColumn("user_id",PrimaryKeyValue.fromString("00002"));
    PrimaryKey routingValue = pkbuild.build();
    searchRequest.setRoutingValues(Arrays.asList(routingValue));
    SearchResponse searchResponse = client.search(searchRequest);

    System.out.println(searchResponse.isAllSuccess());
    System.out.println("totalCount:"+ searchResponse.getTotalCount());
    System.out.println("RowCount:"+searchResponse.getRows().size());

  }