全部产品
Search
文档中心

Tablestore:Konfigurasikan sebuah filter

更新时间:Jul 02, 2025

Setelah mengonfigurasi filter, Tablestore akan memfilter hasil kueri di server. Hanya baris yang memenuhi kondisi filter yang akan dikembalikan. Fitur ini mengurangi volume data yang ditransfer dan mempersingkat waktu respons.

Skenario

  • Filter Hasil Secara Langsung

    Sebagai contoh, meteran listrik pintar berbasis Internet of Things (IoT) mencatat tegangan, arus, penggunaan, dan informasi lainnya ke tabel Tablestore setiap 15 detik. Anda ingin menanyakan data tegangan abnormal dan informasi terkait untuk analisis harian guna menentukan apakah perlu memeriksa kabel.

    Anda dapat menggunakan operasi GetRange untuk membaca data pemantauan yang dihasilkan dalam satu hari oleh meteran listrik dan menyaring data tersebut (5.760 catatan) untuk mendapatkan 10 catatan yang dikumpulkan ketika tegangan tidak stabil.

    Dengan menggunakan filter, hanya 10 catatan yang relevan yang akan dikembalikan. Hal ini mengurangi volume data yang dikembalikan dan menghilangkan kebutuhan untuk pemrosesan data awal, sehingga mengurangi biaya pengembangan.

  • Filter Hasil Setelah Pencocokan Ekspresi Reguler dan Konversi Data

    Jika data disimpan dalam format kustom seperti string JSON dalam kolom dan Anda ingin menanyakan nilai subbidang, Anda dapat menggunakan ekspresi reguler untuk mencocokkan lalu mengubah nilainya menjadi tipe data yang diperlukan. Kemudian, Anda dapat menggunakan filter untuk mendapatkan data yang dibutuhkan.

    Sebagai contoh, data yang disimpan dalam kolom berada dalam format {cluster_name:name1,lastupdatetime:12345}. Jika Anda perlu memfilter dan menanyakan nilai dari baris lastupdatetime>12345, Anda dapat menggunakan ekspresi reguler lastupdatetime:([0-9]+)} untuk mencocokkan data subbidang dalam kolom, mengonversi hasil yang cocok menjadi tipe numerik, lalu membandingkan data numerik dengan hasil yang cocok. Dengan cara ini, Anda bisa mendapatkan baris data yang diperlukan.

Ikhtisar

Saat menanyakan data dengan memanggil operasi GetRow, BatchGetRow, atau GetRange, Anda dapat menggunakan filter untuk mengembalikan hanya baris yang memenuhi kondisi filter. Semantik asli dan batasan operasi ini tetap tidak berubah. Untuk informasi lebih lanjut, lihat Baca Data.

Saat menggunakan filter, Anda dapat mengonfigurasi pengaturan berikut sesuai dengan kebutuhan bisnis:

  • Jika kolom referensi tidak ada dalam baris, konfigurasikan parameter PassIfMissing untuk menentukan apakah baris tersebut akan dikembalikan.

  • Jika kolom referensi berisi data dari beberapa versi, tentukan apakah hanya versi terbaru dari data yang digunakan untuk perbandingan.

  • Gunakan ekspresi reguler untuk mencocokkan nilai subbidang.

  • Gunakan operator relasional dan logika untuk membuat kondisi filter.

Filter yang tersedia adalah SingleColumnValueFilter, SingleColumnValueRegexFilter, dan CompositeColumnValueFilter, yang memfilter baris berdasarkan nilai kolom dari satu atau lebih kolom referensi.

Filter

Deskripsi

SingleColumnValueFilter

Tentukan apakah akan memfilter baris berdasarkan nilai kolom referensi.

SingleColumnValueRegexFilter

Gunakan ekspresi reguler untuk mencocokkan nilai kolom bertipe String dan mengekstrak substring yang cocok. Lalu, ubah tipe data substring yang diekstraksi menjadi String, Integer, atau Double dan filter nilai-nilai setelah konversi.

Ekspresi reguler harus memenuhi kondisi berikut:

  • Ekspresi reguler dapat memiliki panjang hingga 256 byte.

  • Sintaksis ekspresi reguler dalam Perl didukung.

  • Ekspresi reguler single-byte didukung.

  • Pencocokan ekspresi reguler dalam bahasa Cina tidak didukung.

  • Mode pencocokan penuh dan mode pencocokan sebagian dari ekspresi reguler didukung.

    Dalam mode pencocokan sebagian, nilai subbidang yang dicocokkan berada dalam sepasang tanda kurung () dalam ekspresi reguler.

    Jika mode pencocokan penuh digunakan, hasil pencocokan pertama dikembalikan. Jika mode pencocokan sebagian digunakan, hasil sub-cocokan pertama dikembalikan. Sebagai contoh, jika nilai kolom adalah 1aaa51bbb5 dan ekspresi reguler adalah 1[a-z]+5, nilai yang dikembalikan adalah 1aaa5. Jika ekspresi reguler adalah 1([a-z]+)5, nilai yang dikembalikan adalah aaa.

    Penting

    Hanya Tablestore SDK for Java yang mendukung filter SingleColumnValueRegexFilter.

CompositeColumnValueFilter

Tentukan apakah akan memfilter baris berdasarkan kombinasi logis dari hasil pencocokan untuk nilai beberapa kolom referensi.

Catatan Penggunaan

  • Kondisi filter mendukung operator relasional =, !=, >, >=, <, dan <= serta operator logika NOT, AND, dan OR. Kondisi filter dapat mencakup hingga 10 subkondisi.

  • Kolom referensi yang digunakan oleh filter harus termasuk dalam hasil kueri. Jika kolom yang ditentukan tempat data dibaca tidak mencakup kolom referensi, filter tidak dapat menanyakan nilai kolom referensi.

  • Saat menggunakan operasi GetRange, hingga 5.000 baris atau 4 MB data dapat dipindai sekaligus.

    Jika tidak ada data yang memenuhi kondisi filter dalam rentang pemindaian, baris yang dikembalikan akan kosong. Namun, NextStartPrimaryKey mungkin tidak kosong. Jika NextStartPrimaryKey tidak kosong, gunakan nilai parameter tersebut untuk melanjutkan pemindaian sampai nilai return dari NextStartPrimaryKey kosong.

Metode

Penting

Filter hanya dapat digunakan melalui Tablestore SDK.

Filter dapat digunakan dengan 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 ini menggunakan Tablestore SDK for Java.

Gunakan SingleColumnValueFilter untuk memfilter data

Kode sampel berikut menunjukkan cara membaca data versi terbaru dari baris dalam tabel data dan menggunakan filter untuk memfilter data berdasarkan nilai kolom Col0.

private static void getRow(SyncClient client, String pkValue) {
    // Konstruksi primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // Tentukan nama tabel dan primary key untuk membaca satu baris data.
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
    // Setel parameter MaxVersions ke 1 untuk membaca versi terbaru dari data.
    criteria.setMaxVersions(1);

    // Konfigurasikan filter untuk mengembalikan baris di mana nilai kolom Col0 adalah 0.
    SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
            SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    // Jika kolom Col0 tidak ada, baris tidak dikembalikan.
    singleColumnValueFilter.setPassIfMissing(false);
    criteria.setFilter(singleColumnValueFilter);

    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();

    System.out.println("Baca selesai. Hasil:");
    System.out.println(row);
}

Gunakan SingleColumnValueRegexFilter untuk memfilter data berdasarkan pencocokan ekspresi reguler

Kode sampel berikut menunjukkan cara membaca data yang nilai primary key-nya berada dalam rentang ["pk:2020-01-01.log", "pk:2021-01-01.log") dari kolom Col1 dan menggunakan ekspresi reguler untuk memfilter data dalam kolom Col1.

private static void getRange(SyncClient client) {
    // Tentukan nama tabel data.
    RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
 
    // Tentukan ["pk:2020-01-01.log", "pk:2021-01-01.log") sebagai rentang primary key dari data yang ingin Anda baca. Rentang tersebut adalah interval tertutup kiri, terbuka kanan.
    PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2020-01-01.log"))
        .build();
    PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2021-01-01.log"))
        .build();
    criteria.setInclusiveStartPrimaryKey(pk0);
    criteria.setExclusiveEndPrimaryKey(pk1);
 
    // Setel parameter MaxVersions ke 1 untuk membaca versi terbaru dari data.
    criteria.setMaxVersions(1);
 
    // Konfigurasikan filter. Baris dikembalikan ketika cast<int>(regex(Col1)) lebih besar dari 100.
    RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
    SingleColumnValueRegexFilter filter =  new SingleColumnValueRegexFilter("Col1",
        regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN,ColumnValue.fromLong(100));
    criteria.setFilter(filter);

    while (true) {
        GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
        for (Row row : resp.getRows()) {
            // lakukan sesuatu
            System.out.println(row);
        }
        if (resp.getNextStartPrimaryKey() != null) {
            criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
        } else {
            break;
        }
   }
}

Gunakan CompositeColumnValueFilter untuk memfilter data

Kode sampel berikut digunakan untuk mengembalikan baris yang primary key-nya berada dalam rentang ["a","h"). Selain itu, nilai Col0 adalah 0 dan salah satu dari nilai Col1 lebih besar dari 100 atau nilai Col2 kurang dari atau sama dengan 10.

private static void getRange(SyncClient client) {
    // Tentukan nama tabel data.
    RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");

    // Tentukan rentang primary key. Rentang primary key adalah interval tertutup kiri dan terbuka kanan.
    PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("a"))
            .build();
    PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("h"))
            .build();
    criteria.setInclusiveStartPrimaryKey(pk0);
    criteria.setExclusiveEndPrimaryKey(pk1);

    // Setel parameter maxVersions ke 1 untuk membaca versi terbaru dari data.
    criteria.setMaxVersions(1);

    // Setel kondisi composite1 ke (Col0 == 0) AND (Col1 > 100).
    CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
    SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
            SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
            SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
    composite1.addFilter(single1);
    composite1.addFilter(single2);

    // Setel kondisi composite2 ke ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10).
    CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
    SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
            SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
    composite2.addFilter(composite1);
    composite2.addFilter(single3);
    criteria.setFilter(composite2);

    while (true) {
        GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
        for (Row row : resp.getRows()) {
            // lakukan sesuatu
            System.out.println(row);
        }
        if (resp.getNextStartPrimaryKey() != null) {
            criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

Penagihan

Implementasi filter tidak memengaruhi aturan penagihan yang ada.

Meskipun filter mengurangi volume data yang dikembalikan, penggunaan disk I/O tetap tidak berubah karena penyaringan dilakukan di server sebelum data dikembalikan. Oleh karena itu, jumlah unit bacaan (CUs) yang sama dikonsumsi baik filter digunakan maupun tidak. Sebagai contoh, ketika Anda memanggil operasi GetRange untuk membaca 100 rekaman (200 KB) data lalu memfilter rekaman tersebut untuk mendapatkan 10 rekaman (20 KB), 50 unit bacaan dikonsumsi.

FAQ

Bagaimana cara memilih antara indeks sekunder dan indeks pencarian?

Referensi

  • Jika aplikasi perlu menggunakan atribut berbeda sebagai kondisi kueri untuk menanyakan data, Anda dapat menentukan atribut-atribut ini sebagai kolom primary key dari tabel indeks sekunder untuk mempercepat kueri. Untuk informasi lebih lanjut, lihat Indeks Sekunder.

  • Jika bisnis Anda memerlukan kueri multi-dimensi dan analisis data, Anda dapat membuat indeks pencarian dan menentukan atribut yang diperlukan sebagai bidang indeks pencarian. Lalu, Anda dapat menanyakan dan menganalisis data dengan menggunakan indeks pencarian. Kueri multi-dimensi mencakup kueri berdasarkan kolom non-primary key, kueri Boolean, dan kueri fuzzy. Persyaratan analisis data mencakup mendapatkan nilai ekstrem, menghitung baris, dan mengelompokkan data. Untuk informasi lebih lanjut, lihat Indeks Pencarian.