全部产品
Search
文档中心

Tablestore:Tipe data Array dan Nested

更新时间:Dec 07, 2025

Indeks pencarian mendukung tipe data primitif—seperti Long, Double, Boolean, Keyword, Text, Date, GeoPoint, Vector, IP, dan JSON—serta tipe data Array dan Nested. Tipe data Array digunakan untuk menyimpan serangkaian nilai dengan tipe yang sama, sedangkan tipe data Nested mirip dengan tipe JSON dan digunakan untuk menyimpan data berstruktur hierarkis.

Tipe data Array

Penting
  • Tipe data Array hanya dapat digunakan dalam indeks pencarian. Tabel data tidak mendukung tipe data Array.

  • Anda dapat menggunakan tipe data Array seperti tipe data non-Array. Saat mengkueri data menggunakan bidang Array, satu baris data akan dikembalikan jika setidaknya salah satu nilai dalam array memenuhi kondisi tersebut.

  • Tipe data Vector tidak dapat digunakan dalam array.

Tipe data Array merupakan pengubah yang dapat dikombinasikan dengan tipe data primitif, seperti Long, Double, Boolean, Keyword, Text, Date, IP, dan GeoPoint. Misalnya, menggabungkan tipe Array dengan Long menghasilkan array bilangan bulat panjang yang dapat menyimpan beberapa nilai Long. Tipe data Array cocok untuk menyimpan serangkaian nilai dengan tipe yang sama.

Format Array

Tabel berikut menjelaskan kombinasi tipe data Array dan 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. Formatnya adalah Data berformat JSON. Contoh: "[\"Hangzhou\", \"Xi'an\"]".

Text Array

Array teks. Formatnya adalah array 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. Formatnya adalah array 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

Jika tipe data suatu bidang dalam indeks pencarian merupakan kombinasi tipe data Array dan tipe data primitif (misalnya Long atau Double), maka bidang tersebut dalam tabel data tempat indeks pencarian dibuat harus bertipe String, sedangkan bidang dalam indeks pencarian harus bertipe primitif yang sesuai.

Misalnya, jika bidang price bertipe Double Array, maka bidang price dalam tabel data harus bertipe String. Dalam indeks pencarian, bidang yang sesuai harus bertipe Double, dan Anda harus menambahkan properti isArray=true.

Contoh

Asumsikan sebuah tabel data bernama array_search_table. Tabel berikut menunjukkan data sampel.

Tabel data mencakup kolom kunci primer pk dan dua kolom atribut: col_keyword_array dan col_long_array. Semua kolom bertipe 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 yang mencakup dua kolom: col_keyword_array bertipe String Array dan col_long_array bertipe Long Array.

    image

  2. Gunakan indeks pencarian untuk mengkueri data bertipe Array.

    Kode Java berikut menunjukkan cara mengkueri data array. Kondisi kueri menentukan bahwa kolom col_keyword_array berisi elemen yang persis sesuai dengan "Cloud server" dan kolom col_long_array berisi elemen yang sama dengan 2024.

    Catatan

    Anda dapat mengeksekusi Pernyataan SQL untuk mengkueri data bertipe Array dalam indeks pencarian. Untuk informasi selengkapnya, lihat Eksekusi Pernyataan SQL untuk mengkueri data menggunakan indeks pencarian.

    private static void query(SyncClient client) {
        // Kondisi 1: Nilai kolom col_keyword_array berisi elemen yang persis sesuai dengan "Cloud server".
        TermQuery keywordTermQuery = new TermQuery(); // Atur tipe kueri menjadi TermQuery.
        keywordTermQuery.setFieldName("col_keyword_array"); // Tentukan nama kolom yang ingin dicocokkan.
        keywordTermQuery.setTerm(ColumnValue.fromString("Cloud server")); // Tentukan nilai yang digunakan untuk mencocokkan bidang.
        
        // Kondisi 2: Nilai kolom col_long_array berisi elemen yang sama dengan 2024.
        TermQuery longTermQuery = new TermQuery(); // Atur tipe kueri menjadi TermQuery.
        longTermQuery.setFieldName("col_long_array"); // Tentukan nama kolom yang ingin dicocokkan.
        longTermQuery.setTerm(ColumnValue.fromLong(2024l)); // Tentukan nilai yang digunakan untuk mencocokkan bidang.
        
        SearchQuery searchQuery = new SearchQuery();
        // Bangun kueri Boolean di mana hasil kueri memenuhi Kondisi 1 dan Kondisi 2 secara bersamaan.
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(Arrays.asList(keywordTermQuery, longTermQuery));
        searchQuery.setQuery(boolQuery);
        //searchQuery.setGetTotalCount(true); // Tentukan bahwa jumlah total baris yang cocok dikembalikan.
        
        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang ingin dikembalikan atau menentukan agar semua kolom dikembalikan. Jika Anda tidak mengonfigurasi parameter ini, hanya kolom kunci primer yang dikembalikan.
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // Tentukan agar semua kolom dikembalikan.
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Tentukan kolom yang ingin dikembalikan.
        //searchRequest.setColumnsToGet(columnsToGet);
        
        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // Tentukan bahwa jumlah total baris yang cocok (bukan jumlah baris yang dikembalikan) ditampilkan.
        System.out.println("Row: " + resp.getRows());
    }

Tipe data Nested

Data bertipe Nested berupa dokumen bersarang, yang digunakan ketika satu baris data (dokumen) berisi beberapa baris anak (dokumen anak). Beberapa baris anak disimpan dalam bidang nested. Tipe data Nested cocok untuk menyimpan data berstruktur hierarkis.

Anda harus menentukan skema baris anak dalam bidang nested, yang mencakup bidang-bidang dari baris anak beserta properti masing-masing. Tipe data Nested dapat digunakan untuk menyimpan beberapa nilai, mirip dengan tipe data JSON.

Format Nested

Bidang nested diklasifikasikan menjadi bidang nested tingkat tunggal dan multi-level. Tabel berikut menjelaskan kedua tipe tersebut.

Tipe penyarangan

Deskripsi

Tipe nested tingkat tunggal

Tipe nested tingkat tunggal berisi satu lapisan struktur data lain. Hal ini menciptakan struktur sederhana dengan hierarki dasar. Tipe ini cocok untuk skenario yang memerlukan hierarki sederhana tetapi bukan multi-level. Kode berikut adalah contohnya:

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

Tipe nested multi-level

Tipe nested multi-level berisi beberapa lapisan struktur data lain yang bersarang. Hal ini menghasilkan hierarki yang lebih kompleks. Gunakan tipe ini untuk model data yang memerlukan hierarki kaya serta tingkat modularitas atau organisasi yang tinggi. Kode berikut adalah contohnya:

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

Catatan penggunaan

Jika suatu bidang dalam indeks pencarian bertipe Nested, maka bidang tersebut dalam tabel data tempat indeks pencarian dibuat harus bertipe String, dan bidang dalam indeks pencarian harus bertipe Nested. Anda harus menggunakan kueri nested untuk mengkueri bidang bertipe Nested.

Saat menulis data ke tabel data, bidang tabel data yang sesuai dengan bidang nested dalam indeks pencarian harus berupa array objek JSON. Misalnya, [{"tagName":"tag1", "score":0.8,"time": 1730690237000 }, {"tagName":"tag2", "score":0.2,"time": 1730691557000}].

Penting

Anda harus menulis string bertipe JSON Array ke bidang nested, bahkan jika bidang tersebut hanya berisi satu baris anak.

Contoh

Contoh bidang Nested tingkat tunggal

Anda dapat membuat bidang Nested tingkat tunggal di Konsol Tablestore atau menggunakan SDK Tablestore.

Bagian ini menjelaskan cara membuat bidang Nested tingkat tunggal menggunakan SDK Tablestore untuk Java. Dalam contoh ini, bidang Nested bernama tags dibuat. Setiap baris anak berisi tiga bidang. Gambar berikut menunjukkan detailnya.

image

  • 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 skema untuk bidang-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")));

// Gunakan skema yang dibuat untuk baris anak sebagai nilai subfieldSchemas untuk bidang Nested.
FieldSchema nestedFieldSchema = new FieldSchema("tags", FieldType.NESTED)
    .setSubFieldSchemas(subFieldSchemas);

Contoh bidang Nested multi-level

Anda dapat membuat bidang Nested multi-level menggunakan SDK Tablestore.

Bagian ini menjelaskan cara membuat bidang Nested multi-level menggunakan SDK Tablestore untuk Java. Dalam contoh ini, bidang Nested bernama user dibuat. Setiap baris anak berisi empat bidang dengan tipe data primitif berbeda dan satu bidang Nested.

  • Nama bidang: name. Tipe bidang: Keyword.

  • Nama bidang: age. Tipe bidang: Long.

  • Nama bidang: birth. Tipe bidang: Date. Nilai bidang dalam format tanggal.

  • Nama bidang: phone. Tipe bidang: Keyword.

  • Nama bidang Nested: address. Nama bidang dalam setiap baris anak: province, city, dan street. Tipe data semua bidang dalam setiap baris anak: Keyword.

Berikut adalah contoh data yang 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"}]}]

// Buat skema untuk tiga bidang dalam baris anak bidang Nested address. Jalur yang ditentukan oleh user.address dapat digunakan untuk mengkueri data bidang dalam baris anak.
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));

// Buat skema untuk setiap baris anak bidang Nested user. Setiap baris anak berisi tiga bidang dengan tipe data primitif berbeda dan satu bidang Nested bernama address. Jalur yang ditentukan oleh bidang Nested user dapat digunakan untuk mengkueri data bidang dalam baris anak.
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));

// Gunakan skema yang dibuat untuk baris anak bidang Nested user sebagai nilai subfieldSchemas untuk bidang Nested.
List<FieldSchema> fieldSchemas = new ArrayList<>();
fieldSchemas.add(new FieldSchema("user",FieldType.NESTED).setSubFieldSchemas(subFieldSchemas));

Batasan

  • Indeks nested tidak mendukung fitur IndexSort, yang dapat digunakan untuk meningkatkan performa kueri dalam berbagai skenario.

  • Jika Anda menggunakan indeks pencarian yang berisi bidang nested untuk mengkueri data dan memerlukan paginasi, Anda harus menentukan metode pengurutan untuk mengembalikan data dalam kondisi kueri. Jika tidak, Tablestore tidak akan mengembalikan nextToken saat hanya sebagian data yang memenuhi kondisi kueri telah dibaca.

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

Tipe data Nested dapat digunakan dalam semua kueri, Pengurutan, dan agregasi.

Referensi