全部产品
Search
文档中心

Tablestore:Bagaimana cara menggunakan kolom routing?

更新时间:Jul 02, 2025

Saat membuat indeks pencarian, Anda dapat menentukan satu atau lebih kolom kunci utama sebagai kolom routing. Saat data ditulis ke indeks pencarian, Tablestore menentukan lokasi distribusi data berdasarkan nilai dari kolom routing tersebut. Baris dengan nilai kolom routing yang sama diindeks ke partisi yang sama.

Prosedur

  1. Tentukan satu atau lebih kolom routing saat membuat indeks pencarian.

    Jika Anda menentukan kolom routing saat membuat indeks pencarian, kolom tersebut digunakan untuk menemukan data indeks selama operasi baca dan tulis.

    Anda dapat memodifikasi skema indeks pencarian secara dinamis untuk mengubah kolom routing. Sebagai contoh, Anda dapat mengubah kolom routing default menjadi kolom routing kustom atau sebaliknya. Kolom routing default adalah kunci partisi. Untuk informasi lebih lanjut, lihat Modifikasi skema indeks pencarian secara dinamis.

    Penting

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

  2. Saat mengquery data menggunakan indeks pencarian, sertakan kolom routing dalam permintaan query.

    Tablestore hanya memindai partisi tertentu berdasarkan kolom routing yang diberikan dalam permintaan query. Hal ini mengurangi latensi query karena partisi yang dipindai lebih terbatas. Jika Anda menentukan kolom routing untuk indeks pencarian, Anda harus menyertakan kolom routing saat menggunakan indeks pencarian untuk mengquery data. Apakah Anda menentukan kolom routing tidak memengaruhi hasil query, tetapi jika tidak disertakan, Tablestore akan memindai partisi yang tidak relevan, membuang sumber daya sistem, dan meningkatkan latensi query.

    Penting

    Anda dapat menentukan satu atau lebih nilai untuk kolom routing, namun tidak dapat menentukan rentang nilai.

Metode

Anda dapat menentukan kolom routing di konsol Tablestore, CLI Tablestore, atau SDK Tablestore. Kolom routing dapat ditentukan saat membuat indeks pencarian atau dimodifikasi untuk indeks pencarian yang sudah ada. Bagian ini menjelaskan cara menentukan kolom routing saat membuat indeks pencarian. Berikut adalah prasyarat yang harus dipenuhi:

Catatan

Setelah membuat indeks pencarian, Anda dapat memodifikasi skema indeks pencarian untuk mengubah kolom routing. Untuk informasi lebih lanjut, lihat Modifikasi skema indeks pencarian secara dinamis.

  • Sebuah tabel data yang memenuhi kondisi berikut telah dibuat:

    • Parameter max versions tabel data disetel ke 1.

    • Waktu hidup (TTL) tabel data disetel ke -1 atau operasi pembaruan pada tabel data dilarang.

  • Jika menggunakan SDK Tablestore untuk menentukan kolom routing, klien harus diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi klien Tablestore.

  • Jika menggunakan CLI Tablestore untuk menentukan kolom routing, CLI Tablestore harus diinstal dan dikonfigurasi dengan informasi instance yang ingin diakses. Untuk informasi lebih lanjut, lihat Unduh CLI Tablestore dan Mulai CLI Tablestore dan konfigurasikan informasi akses.

Gunakan konsol Tablestore

Saat membuat indeks pencarian di konsol Tablestore, aktifkan Advanced Settings dan tentukan kolom routing, seperti yang ditunjukkan pada gambar berikut. Untuk informasi lebih lanjut, lihat Memulai Cepat.

image

Gunakan CLI Tablestore

Anda dapat menggunakan CLI Tablestore untuk menjalankan perintah create_search_index guna membuat indeks pencarian. Untuk informasi lebih lanjut, lihat Indeks Pencarian.

  1. Tentukan kolom routing saat membuat indeks pencarian.

    Kode sampel berikut menunjukkan cara membuat indeks pencarian bernama mysearchindex. Indeks pencarian mencakup bidang gid tipe LONG, uid tipe LONG, col2 tipe LONG, col3 tipe TEXT, col1 tipe KEYWORD, dan col3V tipe LONG. Bidang col3V adalah kolom virtual yang sesuai dengan kolom col3 di tabel data. Dalam contoh ini, kolom routing indeks pencarian adalah uid.

    create_search_index -n mysearchindex

    Ikuti petunjuk di layar untuk menentukan skema indeks pencarian. Modifikasi pengaturan bidang dalam kode sampel sesuai kebutuhan bisnis Anda sebelum menggunakan indeks pencarian untuk mengquery data. Kode sampel:

    {
    
        "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 kolom routing saat menggunakan indeks pencarian untuk mengquery data.

    Kode sampel berikut menunjukkan cara menggunakan indeks pencarian mysearchindex untuk mengquery baris dengan nilai kolom col2 kurang dari 200. Saat mengquery data, Anda harus menyertakan kolom routing indeks pencarian. Dalam contoh ini, kolom routing adalah uid.

    search -n search_index --return_all_indexed

    Ikuti petunjuk di layar untuk menentukan kondisi query. Modifikasi kondisi query dalam kode sampel sesuai kebutuhan bisnis Anda sebelum menggunakan indeks pencarian untuk mengquery data. Kode sampel:

    Catatan

    Dalam contoh ini, metode query rentang digunakan. Untuk informasi tentang metode query yang didukung oleh fitur indeks pencarian, lihat Fitur Dasar.

    {
        "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 kolom routing saat membuat indeks pencarian: SDK Tablestore untuk Java, SDK Tablestore untuk Go, SDK Tablestore untuk Python, SDK Tablestore untuk Node.js, SDK Tablestore untuk .NET, dan SDK Tablestore untuk PHP. Dalam contoh ini, SDK Tablestore untuk Java digunakan untuk menjelaskan cara menentukan dan menggunakan kolom routing.

Kode sampel berikut menunjukkan cara membuat indeks pencarian bernama order_index dan menyetel kolom routing ke bidang user_id saat membuat tabel data bernama order, menulis data ke tabel data, dan menyertakan kolom routing dalam permintaan query. Dalam contoh ini, tabel data mencakup kolom kunci utama order_id tipe STRING dan user_id tipe STRING. Indeks pencarian mencakup bidang product_name tipe KEYWORD, order_time tipe LONG, dan user_id tipe KEYWORD.

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

    // Buat indeks pencarian dan tentukan kolom routing. 
    CreateSearchIndexRequest searchIndexRequest = new CreateSearchIndexRequest();
    // Tentukan nama tabel data. 
    searchIndexRequest.setTableName("order"); 
    // Tentukan nama indeks pencarian yang dibuat untuk tabel data. 
    searchIndexRequest.setIndexName("order_index"); 
    IndexSchema indexSchema = new IndexSchema();
    IndexSetting indexSetting = new IndexSetting();
    // Setel kolom routing ke bidang user_id. 
    indexSetting.setRoutingFields(Arrays.asList("user_id"));
    indexSchema.setIndexSetting(indexSetting);

    // Tambahkan bidang indeks. Bidang indeks berikut hanya ditambahkan sebagai referensi. Anda dapat menambahkan bidang indeks berdasarkan kebutuhan bisnis Anda. 
    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);
    // Tunggu hingga tabel data dimuat. 
    Thread.sleep(6*1000); 

    // Masukkan data untuk pengujian. 

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

      // Tulis data ke kolom atribut. 
      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));

    }
    // Tunggu hingga data disinkronkan ke indeks pencarian. 
    Thread.sleep(20*1000);

    // Berikan kolom routing dalam permintaan query. 
    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());

  }