Indeks pencarian mendukung tipe bidang NESTED selain tipe dasar seperti LONG, DOUBLE, BOOLEAN, KEYWORD, dan TEXT. NESTED digunakan untuk merepresentasikan dokumen bersarang, yaitu ketika satu baris data (dokumen) berisi beberapa baris anak (dokumen anak). Topik ini menjelaskan cara menanyakan data dari bidang NESTED menggunakan fitur kueri SQL.
Untuk informasi lebih lanjut tentang tipe NESTED, lihat Tipe Bidang ARRAY dan Nested.
Catatan penggunaan
Untuk menanyakan data dari bidang NESTED, data pada tabel terkait harus bertipe STRING. Saat membuat indeks pencarian untuk suatu bidang, atur tipe data ke NESTED dan tentukan data serta tipe data untuk bidang anak dari indeks tersebut.
Pemetaan tipe data
Tipe data dalam tabel | Tipe data dalam indeks pencarian | Tipe data dalam SQL |
STRING | NESTED. Tipe data dari bidang anak sama dengan tipe data yang ditulis ke bidang anak. |
|
Buat tabel pemetaan untuk indeks pencarian
Untuk menanyakan data dari bidang NESTED menggunakan pernyataan SQL, Anda harus membuat tabel pemetaan untuk indeks pencarian. Untuk detail lebih lanjut, lihat Buat Tabel Pemetaan untuk Indeks Pencarian.
Dalam pernyataan CREATE TABLE, tentukan nama valid dan tipe data SQL yang dipetakan untuk bidang NESTED. Bidang anak dari bidang NESTED dibuat secara otomatis. Kami merekomendasikan penggunaan MEDIUMTEXT sebagai tipe data SQL untuk bidang NESTED saat membuat tabel pemetaan.
Saat menjalankan pernyataan ALTER TABLE untuk membuat atau menghapus bidang NESTED, bidang anak dari bidang NESTED akan dibuat atau dihapus secara otomatis.
Contoh pernyataan SQL berikut menunjukkan cara membuat tabel pemetaan untuk indeks pencarian yang berisi bidang NESTED.
CREATE TABLE `test_table__test_table_index`(
`col_nested` MEDIUMTEXT
)
ENGINE='searchindex'
ENGINE_ATTRIBUTE='{"index_name":"test_table_index", "table_name":"test_table"}';Tanyakan data dengan menjalankan pernyataan SQL
Saat menjalankan pernyataan SQL untuk menanyakan data dari bidang NESTED, Anda dapat langsung menggunakan bidang anak dari bidang NESTED bersama dengan operator untuk menentukan kondisi kueri, seperti col_nested.col_long = 1. Selain itu, Anda dapat menggunakan fungsi NESTED_QUERY(subcol_column_condition) untuk menentukan kondisi kueri. Pilih salah satu metode berdasarkan kebutuhan kueri Anda dalam skenario nyata. Parameter subcol_column_condition dalam fungsi tersebut menunjukkan kondisi untuk menanyakan bidang anak pada tingkat yang sama.
Saat menggunakan bidang NESTED untuk menentukan kondisi kueri, tentukan nama bidang anak dari bidang NESTED dalam format 'Nama bidang NESTED.Nama bidang anak'. Jika bidang NESTED berisi bidang multi-level, tambahkan nama bidang anak setelah nama bidang anak sebelumnya untuk penanyaaan data, dengan pemisah titik (.). Sebagai contoh, jika sebuah bidang NESTED bernama col_nested dan memiliki bidang anak bernama col_long, bidang anak tersebut diberi nama 'col_nested.col_long' dalam kondisi kueri. Jika sebuah bidang NESTED bernama col1, bidang NESTED col1 memiliki bidang anak bernama col2, dan bidang anak col2 memiliki bidang anak bernama col3, bidang anak col3 diberi nama 'col1.col2.col3' dalam kondisi kueri.
Jika menggunakan fungsi NESTED_QUERY(subcol_column_condition), elemen JSON dari bidang anak dalam satu baris harus memenuhi semua kondisi kueri.
Sebagai contoh, sebuah bidang NESTED bernama tags berisi dua elemen JSON: [{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]. Pernyataan sampel berikut menggambarkan perbedaan antara kedua metode untuk menanyakan data dari bidang NESTED.
Gunakan bidang anak dari bidang NESTED bersama dengan operator
Pernyataan SQL sampel:
SELECT tags FROM `test_table__test_table_index` WHERE `tags.tagName` = 'tag1' AND `tags.score` = 0.2;Elemen JSON pertama memenuhi kondisi kueri
'tags.tagName' = 'tag1'dan elemen JSON kedua memenuhi kondisi kueri'tags.score' = 0.2. Hasil berikut dikembalikan:[{"tagName":"tag1", "score":0.8}, {"tagName":"tag2", "score":0.2}]Gunakan fungsi
NESTED_QUERY(subcol_column_condition)Pernyataan SQL sampel:
SELECT tags FROM `test_table__test_table_index` WHERE NESTED_QUERY(`tags.tagName` = 'tag1' AND `tags.score` = 0.2);Tidak ada elemen JSON yang memenuhi kedua kondisi kueri
'tags.tagName' = 'tag1'dan'tags.score' = 0.2. Oleh karena itu, tidak ada hasil yang dikembalikan.
Batasan
Anda dapat menggunakan fungsi
NESTED_QUERY(subcol_column_condition)untuk menanyakan bidang anak dari bidang NESTED pada tingkat yang sama. Elemen JSON dalam baris dari bidang NESTED harus memenuhi semua kondisi kueri.SELECT * FROM `test_table__test_table_index` WHERE NESTED_QUERY(`col1.col2` = 1 AND NESTED_QUERY(`col1.col3.col4` = 2));Fungsi
NESTED_QUERY(subcol_column_condition)hanya dapat digunakan dalam tabel pemetaan dari indeks pencarian. Anda hanya dapat menentukan satu ekspresi dengan fungsi ini dan harus menggunakan operator logis seperti AND atau OR untuk menghubungkan beberapa ekspresi. Fungsi ini hanya dapat digunakan dalam klausa WHERE dari pernyataan SELECT, bukan sebagai ekspresi kolom, fungsi agregat, atau untuk pengurutan.Anda hanya dapat menentukan satu ekspresi menggunakan fungsi
NESTED_QUERY(subcol_column_condition). Untuk menghubungkan beberapa ekspresi, gunakan operator logis seperti AND atau OR. Fungsi ini hanya dapat digunakan dalam klausa WHERE dari pernyataan SELECT dan tidak dapat digunakan sebagai ekspresi kolom, fungsi agregat, atau untuk pengurutan.Bidang NESTED tidak dapat digunakan sebagai nama bidang atau ekspresi kolom dalam pernyataan SELECT atau fungsi agregat. Bidang NESTED juga tidak dapat digunakan untuk pengelompokan atau pengurutan.
Saat menggunakan pernyataan
ALTER TABLEuntuk membuat atau menghapus bidang NESTED, Anda tidak dapat secara langsung membuat atau menghapus bidang anak dari bidang NESTED. Bidang anak dibuat atau dihapus secara otomatis.Data dari bidang anak tidak dapat dihitung setelah konversi tipe data atau didorong ke fungsi dalam indeks pencarian untuk perhitungan. Pastikan tipe data dari bidang anak valid saat menanyakan data.
Contoh
Dalam contoh berikut, tabel yang ditanyakan bernama test_table dan berisi bidang col_nested bertipe STRING.
Untuk menanyakan data dari bidang NESTED dalam tabel, Anda harus membuat indeks pencarian dan tabel pemetaan. Ikuti langkah-langkah berikut:
Buat indeks pencarian. Untuk detail lebih lanjut, lihat Memulai Cepat atau Gunakan SDK Tablestore.
Indeks pencarian bernama
test_table_indexdan berisi bidangcol_nestedbertipe NESTED.Gambar berikut menunjukkan cara membuat indeks pencarian menggunakan konsol Tablestore.

Buat tabel pemetaan untuk indeks pencarian. Untuk detail lebih lanjut, lihat Buat Tabel Pemetaan untuk Indeks Pencarian.
Tabel pemetaan bernama
test_table__test_table_index, dengan tipe data SQL untuk bidangcol_nestedadalahMEDIUMTEXT.Pernyataan SQL sampel:
CREATE TABLE `test_table__test_table_index`( `col_nested` MEDIUMTEXT ) ENGINE='searchindex' ENGINE_ATTRIBUTE='{"index_name":"test_table_index", "table_name":"test_table"}';Setelah membuat tabel pemetaan, lakukan operasi berikut sesuai kebutuhan bisnis Anda:
Tanyakan deskripsi tabel. Untuk detail lebih lanjut, lihat Tanyakan Informasi tentang Tabel.
Jalankan pernyataan berikut untuk menanyakan deskripsi dari
test_table__test_table_index:DESCRIBE `test_table__test_table_index`;Gambar berikut menunjukkan hasil kueri. Bidang anak
namedanagedari bidang NESTEDcol_nesteddibuat secara otomatis. Nama bidang anak adalahcol_nested.namedancol_nested.age.
Tanyakan data dari tabel.
Jalankan pernyataan berikut untuk menanyakan data dari test_table__test_table_index:
SELECT * FROM `test_table__test_table_index`;Gambar berikut menunjukkan hasil kueri. Dalam contoh ini, lima catatan data terkandung dalam tabel pemetaan
test_table__test_table_index.
Jalankan pernyataan SELECT untuk menanyakan data.
Contoh 1: Dari
col_long_array, tanyakan baris dengan elemen array yang berisiagelebih besar dari 30.SELECT * FROM `test_table__test_table_index` WHERE `col_nest.age` >30;Gambar berikut menunjukkan hasil kueri.

Contoh 2: Dari
col_long_array, tanyakan baris di mana satu atau lebih elemen JSON berisinameyang nilainya dimulai denganIdanagekurang dari 20.SELECT * FROM `test_table__test_table_index` WHERE `col_nested.name` like 'I%' AND `col_nested.age` < 20;Gambar berikut menunjukkan hasil kueri.

Contoh 3: Dari
col_long_array, tanyakan elemen JSON yang berisinameyang nilainya dimulai denganIdanagekurang dari 20.Dalam contoh ini, fungsi
NESTED_QUERY(subcol_column_condition)diperlukan.SELECT * FROM `test_table__test_table_index` WHERE NESTED_QUERY(`col_nested.name` like 'I%' AND `col_nested.age` < 20);Gambar berikut menunjukkan hasil kueri.
