全部产品
Search
文档中心

Tablestore:NESTED yang didukung dalam indeks pencarian

更新时间:Jul 02, 2025

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.

Catatan

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.

  • VARCHAR (kunci utama)

  • MEDIUMTEXT (kolom yang telah ditentukan sebelumnya)

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.

Catatan

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 TABLE untuk 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:

  1. Buat indeks pencarian. Untuk detail lebih lanjut, lihat Memulai Cepat atau Gunakan SDK Tablestore.

    Indeks pencarian bernama test_table_index dan berisi bidang col_nested bertipe NESTED.

    Gambar berikut menunjukkan cara membuat indeks pencarian menggunakan konsol Tablestore.

    image..png

  2. 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 bidang col_nested adalah MEDIUMTEXT.

    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 name dan age dari bidang NESTED col_nested dibuat secara otomatis. Nama bidang anak adalah col_nested.name dan col_nested.age.

      image..png

    • 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.

      image..png

  3. Jalankan pernyataan SELECT untuk menanyakan data.

    • Contoh 1: Dari col_long_array, tanyakan baris dengan elemen array yang berisi age lebih besar dari 30.

      SELECT * FROM `test_table__test_table_index` WHERE `col_nest.age` >30;

      Gambar berikut menunjukkan hasil kueri.

      image..png

    • Contoh 2: Dari col_long_array, tanyakan baris di mana satu atau lebih elemen JSON berisi name yang nilainya dimulai dengan I dan age kurang 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.

      image..png

    • Contoh 3: Dari col_long_array, tanyakan elemen JSON yang berisi name yang nilainya dimulai dengan I dan age kurang 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.

      image..png