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
-
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: |
|
Double Array |
Array bilangan titik mengambang. Contoh: |
|
Boolean Array |
Array Nilai Boolean. Contoh: |
|
Keyword Array |
Array string dalam format JSON. Contoh: |
|
Text Array |
Array teks dalam format JSON. Contoh: Array teks jarang digunakan. |
|
Date Array |
Array tanggal. Jika tipe tanggal berupa bilangan bulat, formatnya adalah |
|
IP Array |
Array alamat IP dalam format JSON. Contoh: |
|
Geopoint Array |
Array titik geografis. Contoh: |
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 primerpk(tipe String) dan dua kolom atribut:col_keyword_array(tipe String) dancol_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] |
-
Buat indeks pencarian.
Buat indeks pencarian bernama
array_query_table_index. Indeks ini mencakup dua kolom:col_keyword_array(tipe String Array) dancol_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.
-
Kueri data bertipe Array menggunakan indeks pencarian.
Kode Java berikut melakukan kueri data array di mana kolom
col_keyword_arrayberisi elemen yang persis sesuai dengan "Cloud server" dan kolomcol_long_arrayberisi elemen yang nilainya sama dengan 2024.CatatanUntuk 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:
|
|
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:
|
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}].
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
Indeks Pencarian mendukung berbagai jenis kueri untuk kueri data multidimensi, termasuk kueri tepat, kueri istilah, Pencocokan semua kueri, kueri cocok, kueri frasa cocok, kueri rentang, kueri awalan, kueri akhiran, kueri wildcard, kueri wildcard berbasis token, kueri multi-bidang, kueri geografis, kueri bersarang, Pencarian vektor, dan kueri eksistensi.
Saat mengkueri data, Anda dapat melakukan pengurutan dan paginasi set hasil atau melakukan kolaps (deduplikasi).
Untuk analisis data, seperti mencari nilai maksimum atau minimum, menghitung jumlah, atau menghitung baris, Anda dapat menggunakan fitur agregasi statistik atau kueri SQL.
Untuk mengekspor data dengan cepat tanpa memperhatikan urutan set hasil, Anda dapat menggunakan fitur Parallel Scan.