All Products
Search
Document Center

Tablestore:Bagaimana cara menggunakan routing fields?

Last Updated:Jul 17, 2026

Saat membuat search index, Anda dapat menentukan satu atau beberapa kolom kunci primer sebagai routing fields. Saat data indeks ditulis ke search index, Tablestore menentukan lokasi distribusi data berdasarkan nilai routing fields tersebut. Baris-baris dengan nilai routing fields yang sama akan diindeks ke partisi yang sama.

Prosedur

  1. Tentukan satu atau beberapa routing fields saat membuat search index.

    Routing fields yang ditentukan akan digunakan untuk menentukan lokasi data indeks pada operasi baca dan tulis.

    Anda dapat memodifikasi skema search index secara dinamis untuk mengubah routing fields-nya—misalnya, mengganti routing field default dengan routing fields kustom, atau sebaliknya. Routing field default adalah partition key. Untuk informasi selengkapnya, lihat Dynamically modify search index schema.

    Penting

    Hanya kolom kunci primer di Tablestore yang dapat ditentukan sebagai routing fields. Dalam kebanyakan kasus, cukup tentukan satu routing field. Jika Anda menentukan beberapa routing fields, sistem akan menggabungkan nilai-nilai tersebut menjadi satu nilai sebagai routing key.

  2. Saat melakukan kueri data menggunakan search index, sertakan routing fields dalam permintaan kueri.

    Tablestore hanya akan memindai partisi-partisi tertentu berdasarkan routing fields yang Anda berikan dalam permintaan kueri. Hal ini mengurangi latency karena jumlah partisi yang dipindai lebih sedikit. Jika Anda telah menentukan routing fields untuk search index, Anda harus menyediakannya saat melakukan kueri. Meskipun penentuan routing fields tidak memengaruhi hasil kueri, ketidakhadirannya menyebabkan Tablestore memindai partisi yang tidak relevan, sehingga memboroskan sumber daya sistem dan meningkatkan latency kueri.

    Penting

    Anda dapat menentukan satu atau beberapa nilai untuk suatu routing field, tetapi tidak dapat menentukan rentang nilai (value range) untuk routing field tersebut.

Metode

Anda dapat menentukan routing fields melalui Konsol Tablestore, CLI Tablestore, atau SDK Tablestore—baik saat membuat search index maupun memodifikasinya untuk search index yang sudah ada. Bagian ini memberikan contoh cara menentukan routing fields saat membuat search index. Berikut prasyarat yang harus dipenuhi sebelum menentukan routing fields untuk search index:

Catatan

Setelah membuat search index, Anda dapat memodifikasi skemanya untuk mengubah routing fields. Untuk informasi selengkapnya, lihat Dynamically modify search index schema.

  • Tabel data yang memenuhi kedua kondisi berikut telah dibuat:

    • Parameter max versions pada tabel data diatur ke 1.

    • Time to live (TTL) tabel data diatur ke -1 atau operasi update pada tabel data dilarang.

  • Jika Anda ingin menggunakan SDK Tablestore untuk menentukan routing fields, client harus telah diinisialisasi. Untuk informasi selengkapnya, lihat Initialize a Tablestore client.

  • Jika Anda ingin menggunakan CLI Tablestore untuk menentukan routing fields, CLI Tablestore harus telah diinstal dan dijalankan, serta informasi instans yang ingin diakses telah dikonfigurasi. Untuk informasi selengkapnya, lihat Download the Tablestore CLI dan Start the Tablestore CLI and configure access information.

Gunakan Konsol Tablestore

Saat membuat search index di Konsol Tablestore, aktifkan Advanced Settings dan tentukan routing fields. Untuk informasi selengkapnya, lihat Quick start.

Atur Table Name menjadi order dan Index Name menjadi order_index. Atur Schema Generation menjadi Auto Generate. Bidang indeks mencakup user_id (String), product_nan (String), dan order_time (Long). Atur Routing Key menjadi user_id, Data Lifecycle menjadi -1, dan Pre-sort menjadi Default Sort.

Gunakan CLI Tablestore

Anda dapat menggunakan CLI Tablestore untuk menjalankan perintah create_search_index guna membuat search index. Untuk informasi selengkapnya, lihat Search indexes.

  1. Tentukan routing fields saat membuat search index.

    Kode contoh berikut menunjukkan cara membuat search index bernama mysearchindex yang berisi bidang gid (LONG), uid (LONG), col2 (LONG), col3 (TEXT), col1 (KEYWORD), dan col3V (LONG). Bidang col3V adalah kolom virtual yang berkorespondensi dengan kolom col3 di tabel data. Pada contoh ini, routing field search index adalah bidang uid.

    create_search_index -n mysearchindex

    Ikuti petunjuk di layar untuk menentukan skema search index. Sesuaikan pengaturan bidang dalam kode contoh sesuai kebutuhan bisnis sebelum menggunakan search index untuk melakukan kueri data. Kode contoh:

    {
    
        "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. Sertakan routing fields saat menggunakan search index untuk melakukan kueri data.

    Kode contoh berikut menunjukkan cara menggunakan search index mysearchindex untuk mengkueri baris-baris dengan nilai kolom col2 kurang dari 200. Saat melakukan kueri, Anda harus menyediakan routing fields search index—dalam contoh ini, uid.

    search -n search_index --return_all_indexed

    Ikuti petunjuk di layar untuk menentukan kondisi kueri. Sesuaikan kondisi kueri dalam kode contoh sesuai kebutuhan bisnis sebelum menggunakan search index untuk melakukan kueri data. Kode contoh:

    Catatan

    Pada contoh ini, digunakan metode range query. Untuk informasi tentang metode kueri yang didukung oleh fitur search index, lihat Basic features.

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

Gunakan SDK Tablestore

Anda dapat menggunakan SDK Tablestore berikut untuk menentukan routing fields saat membuat search index: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, dan Tablestore SDK for PHP. Contoh berikut menggunakan Tablestore SDK for Java untuk menjelaskan cara menentukan dan menggunakan routing fields.

Kode contoh berikut menunjukkan cara membuat search index bernama order_index dan menetapkan routing field ke bidang user_id saat membuat tabel data bernama order, menulis data ke tabel tersebut, serta menyediakan routing field dalam permintaan kueri. Tabel data berisi kolom kunci primer order_id (STRING) dan user_id (STRING). Search index berisi bidang product_name (KEYWORD), order_time (LONG), dan user_id (KEYWORD).

private static void testRoute(SyncClient client) throws InterruptedException {
    // Create a table. 
    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);

    // Create a search index and specify routing fields. 
    CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
    // Specify the name of the data table. 
    searchIndexRequest.setTableName("order"); 
    // Specify the name of the search index that is created for the data table. 
    searchIndexRequest.setIndexName("order_index"); 
    IndexSchema indexSchema = new IndexSchema();
    IndexSetting indexSetting = new IndexSetting();
    // Set the routing field to the user_id field. 
    indexSetting.setRoutingFields(Arrays.asList("user_id"));
    indexSchema.setIndexSetting(indexSetting);

    // Add index fields. The following index fields are added only for reference. You can add index fields based on your business requirements. 
    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);
    // Wait until the data table is loaded. 
    Thread.sleep(6*1000); 

    // Insert data for testing. 

    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);

      // Write data to attribute columns. 
      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));

    }
    // Wait until data is synchronized to the search index. 
    Thread.sleep(20*1000);

    // Provide the routing field in a query request. 
    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());

  }