All Products
Search
Document Center

Tablestore:Tipe data Array dan Nested

Last Updated:Jun 21, 2026

Indeks pencarian mendukung tipe data Array dan Nested selain tipe primitif seperti Long, Double, Boolean, Keyword, Text, Date, GeoPoint, Vector, IP, dan JSON. Gunakan tipe Array untuk menyimpan beberapa nilai dengan tipe yang sama, dan tipe Nested untuk menyimpan data hirarkis yang mirip dengan JSON.

Tipe data Array

Penting
  • Tipe data Array hanya berlaku untuk indeks pencarian. Tabel data tidak mendukung tipe data Array.

  • Kueri bidang Array dilakukan dengan cara yang sama seperti bidang non-Array. Baris akan dikembalikan jika setidaknya satu nilai dalam array memenuhi kondisi kueri.

  • Tipe data Vector tidak mendukung array.

Tipe Array adalah pengubah yang digabungkan dengan tipe primitif seperti Long, Double, Boolean, Keyword, Text, Date, IP, dan GeoPoint. Misalnya, menggabungkan tipe Array dengan tipe Long menghasilkan array bilangan bulat panjang yang menyimpan beberapa bilangan bulat panjang.

Format Array

Tabel berikut menjelaskan format array untuk tipe data primitif dalam indeks pencarian.

Tipe Array

Deskripsi

Long Array

Array bilangan bulat panjang. Contoh: "[1000, 4, 5555]".

Double Array

Array bilangan titik mengambang. Contoh: "[3.1415926, 0.99]".

Boolean Array

Array Nilai Boolean. Contoh: "[true, false]".

Keyword Array

Array string dalam format JSON. Contoh: "[\"Hangzhou\", \"Xi'an\"]".

Text Array

Array teks dalam format JSON. Contoh: "[\"Hangzhou\", \"Xi'an\"]".

Array teks jarang digunakan.

Date Array

Array tanggal. Jika tipe tanggal berupa bilangan bulat, formatnya adalah "[1218197720123, 1712850436000]". Jika tipe tanggal berupa string, formatnya adalah "[\"2024-04-11 23:47:16.854775807\", \"2024-06-11 23:47:16.854775807\"]".

IP Array

Array alamat IP dalam format JSON. Contoh: "[\"192,168.1.1\", \"255.255.255.255\"]".

Geopoint Array

Array titik geografis. Contoh: "[\"34.2, 43.0\", \"21.4, 45.2\"]".

Catatan penggunaan

Untuk bidang bertipe Array dalam indeks pencarian, bidang yang sesuai di tabel data harus bertipe String, dan bidang dalam indeks pencarian harus bertipe primitif yang sesuai, seperti Long atau Double.

Sebagai contoh, jika bidang price bertipe Double Array, maka bidang price di tabel data harus bertipe String. Di indeks pencarian, atur tipe bidang menjadi Double dan tambahkan properti isArray=true.

Contoh

Asumsikan tabel data bernama array_search_table berisi data sampel berikut.

Tabel data mencakup kolom kunci primer pk (tipe String) dan dua kolom atribut: col_keyword_array (tipe String) dan col_long_array (tipe String).

pk

col_keyword_array

col_long_array

03#server#07

["Development environment", "Test environment", "Physical server", "Linux" ]

[2020, 2023]

4c#server#ae

["Production environment", "Cloud server", "Linux" ]

[2021, 2024]

  1. Buat indeks pencarian.

    Buat indeks pencarian bernama array_query_table_index. Indeks ini mencakup dua kolom: col_keyword_array (tipe String Array) dan col_long_array (tipe Long Array).

    Untuk Schema Generation Method, pilih Auto-generate. Kemudian, di tabel konfigurasi bidang, pastikan tombol Array diaktifkan untuk bidang yang sesuai.

  2. Kueri data bertipe Array menggunakan indeks pencarian.

    Kode Java berikut melakukan kueri data array di mana kolom col_keyword_array berisi elemen yang persis sesuai dengan "Cloud server" dan kolom col_long_array berisi elemen yang nilainya sama dengan 2024.

    Catatan

    Untuk melakukan kueri data bertipe Array dalam indeks pencarian menggunakan pernyataan SQL, lihat Eksekusi pernyataan SQL untuk mengkueri data menggunakan indeks pencarian.

    private static void query(SyncClient client) {
        // Kondisi 1: Bidang col_keyword_array berisi elemen yang persis sesuai dengan "ECS".
        TermQuery keywordTermQuery = new TermQuery(); 
        keywordTermQuery.setFieldName("col_keyword_array"); 
        keywordTermQuery.setTerm(ColumnValue.fromString("ECS")); 
        // Kondisi 2: Bidang col_long_array berisi elemen yang nilainya sama dengan 2024.
        TermQuery longTermQuery = new TermQuery(); 
        longTermQuery.setFieldName("col_long_array"); 
        longTermQuery.setTerm(ColumnValue.fromLong(2024l)); 
        SearchQuery searchQuery = new SearchQuery();
        // Kedua kondisi harus terpenuhi.
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(Arrays.asList(keywordTermQuery, longTermQuery));
        searchQuery.setQuery(boolQuery);
        //searchQuery.setGetTotalCount(true); // Atur agar mengembalikan jumlah total baris yang cocok.
        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang dikembalikan atau mengembalikan semua kolom. Jika parameter ini tidak dikonfigurasi, hanya kolom kunci primer yang dikembalikan secara default.
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // Atur agar mengembalikan semua kolom.
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Atur agar mengembalikan kolom tertentu.
        //searchRequest.setColumnsToGet(columnsToGet);
        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // Cetak jumlah total baris yang cocok, bukan jumlah baris yang dikembalikan.
        System.out.println("Row: " + resp.getRows());
    }

Tipe data Nested

Tipe Nested merepresentasikan dokumen bersarang. Satu baris data (dokumen) dapat berisi beberapa baris anak (dokumen anak) yang disimpan dalam bidang nested. Tipe Nested cocok untuk menyimpan data hirarkis.

Tentukan skema baris anak dalam bidang nested, termasuk bidang dan properti masing-masing baris anak. Tipe Nested mendukung banyak nilai dan mirip dengan tipe data JSON.

Format Nested

Bidang nested diklasifikasikan menjadi tipe single-level dan multi-level.

Jenis nesting

Deskripsi

Tipe nested single-level

Berisi satu lapis struktur data bersarang dengan hirarki dasar. Cocok untuk skenario yang membutuhkan relasi induk-anak sederhana tanpa banyak level. Contoh:

[
    {
        "tagName": "tag1",
        "score": 0.8
    },
    {
        "tagName": "tag2",
        "score": 0.2
    }
]

Tipe nested multi-level

Berisi beberapa lapis struktur data bersarang dengan hirarki kompleks. Cocok untuk model data yang memerlukan hirarki kaya dan tingkat modularitas tinggi. Contoh:

[
    {
        "name": "Zhang San",
        "age": 20,
        "phone": "1390000****",
        "address": [
            {
                "province": "Zhejiang Province",
                "city": "Hangzhou City",
                "street": "No. 1201, Xingfu Community, Sunshine Avenue"
            }
        ]
    }
]

Catatan penggunaan

Untuk bidang bertipe Nested dalam indeks pencarian, bidang yang sesuai di tabel data harus bertipe String, dan bidang dalam indeks pencarian harus bertipe Nested. Gunakan kueri nested untuk mengkueri bidang bertipe Nested.

Saat menulis data ke tabel data, format nilai bidang nested sebagai array objek JSON. Sebagai contoh, [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].

Penting

Selalu tulis data sebagai string array JSON ke bidang nested, bahkan jika bidang tersebut hanya berisi satu baris anak.

Contoh

Contoh bidang Nested single-level

Buat bidang Nested single-level di Konsol Tablestore atau menggunakan SDK Tablestore.

Contoh kode Java berikut menunjukkan cara membuat bidang nested bernama tags. Baris anak berisi tiga bidang berikut.

  • Nama bidang: tagName. Tipe bidang: Keyword.

  • Nama bidang: score. Tipe bidang: Double.

  • Nama bidang: time. Tipe bidang: Date. Satuan: milidetik.

Data sampel yang ditulis ke tabel data adalah [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].

// Buat objek FieldSchema untuk bidang dalam baris anak.
List<FieldSchema> subFieldSchemas = new ArrayList<FieldSchema>();
subFieldSchemas.add(new FieldSchema("tagName", FieldType.KEYWORD)
    .setIndex(true).setEnableSortAndAgg(true));
subFieldSchemas.add(new FieldSchema("score", FieldType.DOUBLE)
    .setIndex(true).setEnableSortAndAgg(true));
subFieldSchemas.add(new FieldSchema("time", FieldType.DATE)
    .setDateFormats(Arrays.asList("epoch_millis")));
// Tetapkan objek FieldSchema baris anak ke subFieldSchemas bidang nested.
FieldSchema nestedFieldSchema = new FieldSchema("tags", FieldType.NESTED)
    .setSubFieldSchemas(subFieldSchemas);

Contoh bidang Nested multi-level

Buat bidang Nested multi-level menggunakan SDK Tablestore.

Contoh berikut menggunakan SDK Tablestore untuk Java guna membuat bidang Nested bernama user. Setiap baris anak berisi empat bidang tipe primitif dan satu bidang Nested.

  • Nama bidang: name. Tipe bidang: Keyword.

  • Nama bidang: age. Tipe bidang: Long.

  • Nama bidang: birth. Tipe bidang: Date. Format nilai: string tanggal.

  • Nama bidang: phone. Tipe bidang: Keyword.

  • Nama bidang nested: address. Bidang baris anak: province, city, dan street. Tipe data: Keyword untuk semua bidang.

Data sampel yang akan ditulis ke tabel data: [ {"name":"Zhang San","age":20,"birth":"2014-10-10 12:00:00.000","phone":"1390000****","address":[{"province":"Zhejiang Province","city":"Hangzhou City","street":"No. 1201, Xingfu Community, Sunshine Avenue"}]}]

// Definisikan skema subfield untuk bidang nested 'address'. Jalur kueri untuk bidang-bidang ini adalah user.address.
List<FieldSchema> addressSubFiledSchemas = new ArrayList<>();
addressSubFiledSchemas.add(new FieldSchema("province",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("city",FieldType.KEYWORD));
addressSubFiledSchemas.add(new FieldSchema("street",FieldType.KEYWORD));
// Definisikan skema subfield untuk bidang nested 'user'. Setiap baris anak berisi empat bidang tipe primitif dan satu bidang nested 'address'.
List<FieldSchema> subFieldSchemas = new ArrayList<>();
subFieldSchemas.add(new FieldSchema("name",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("age",FieldType.LONG));
subFieldSchemas.add(new FieldSchema("birth",FieldType.DATE).setDateFormats(Arrays.asList("yyyy-MM-dd HH:mm:ss.SSS")));
subFieldSchemas.add(new FieldSchema("phone",FieldType.KEYWORD));
subFieldSchemas.add(new FieldSchema("address",FieldType.NESTED).setSubFieldSchemas(addressSubFiledSchemas));
// Tambahkan skema bidang nested 'user' ke daftar skema bidang utama.
List<FieldSchema> fieldSchemas = new ArrayList<>();
fieldSchemas.add(new FieldSchema("user",FieldType.NESTED).setSubFieldSchemas(subFieldSchemas));

Batasan

  • Indeks pencarian yang berisi bidang Nested tidak mendukung IndexSort, fitur yang meningkatkan performa kueri dalam berbagai skenario.

  • Saat melakukan paginasi hasil kueri dari indeks pencarian yang berisi bidang Nested, tentukan metode pengurutan dalam kondisi kueri. Jika tidak, Tablestore tidak akan mengembalikan nextToken ketika hanya sebagian hasil yang dibaca.

  • Kueri nested memberikan performa lebih rendah dibandingkan jenis kueri lainnya.

Selain batasan ini, tipe Nested mendukung semua jenis kueri, pengurutan, dan agregasi.

Referensi