Selain mengindeks teks, indeks penelusuran Spanner menyediakan cara efisien untuk mengindeks dan membuat kueri dokumen JSON dan JSONB. Gunakan indeks penelusuran untuk kueri JSON dan JSONB mandiri, atau untuk menambah kueri penelusuran teks lengkap lainnya.
Untuk mengetahui informasi selengkapnya, lihat Mengindeks data JSON dan Mengindeks data JSONB.
Membuat token JSON dan JSONB
Anda dapat menggunakan fungsi TOKENIZE_JSON untuk membuat indeks JSON di
GoogleSQL, atau fungsi TOKENIZE_JSONB untuk membuat indeks JSONB di
PostgreSQL. Untuk mengetahui detailnya, lihat TOKENIZE_JSON
dan TOKENIZE_JSONB.
Kueri JSON dan JSONB
Anda dapat menggunakan indeks penelusuran untuk mempercepat kueri yang menyertakan kondisi perbandingan kesetaraan, penampungan JSON, dan keberadaan kunci:
- Perbandingan kesetaraan menentukan apakah dokumen JSON atau subjalur dalam dokumen JSON sama dengan nilai target.
- Penampungan JSON menentukan apakah satu dokumen JSON terdapat dalam dokumen JSON lainnya.
- Keberadaan kunci menentukan apakah kunci atau jalur ada dalam dokumen JSON.
Anda dapat mengekspresikan kondisi ini di setiap dialek sebagai berikut:
Di GoogleSQL:
- Buat predikat kesetaraan menggunakan operator
=,!=,<>,IN, danNOT INpada kolomJSONyang diindeks atau subjalur yang diekstrak dengan akses kolom dan subskrip operator. Misalnya,doc = JSON '{"a": 1}',doc.sub.path[0].key = "value", ataudoc.status IN ("active", "pending"). Operator perbandingan lainnya seperti<,<=,>, dan>=tidak dipercepat oleh indeks penelusuran JSON. - Ekspresikan penampungan JSON dalam skema Anda menggunakan
JSON_CONTAINSfungsi. - Buat kondisi keberadaan kunci menggunakan akses kolom, operator subskrip array, dan
IS NOT NULL. Operator akses kolom dan subskrip array menjelaskan jalur dokumen JSON.IS NOT NULLmemeriksa keberadaan jalur ini (misalnya,doc.sub.path[@index].key IS NOT NULL).
- Buat predikat kesetaraan menggunakan operator
Di PostgreSQL:
- Buat predikat kesetaraan menggunakan operator
=,!=,<>,IN, danNOT INpada kolomJSONByang diindeks atau subjalur yang diekstrak dengan->operator. Misalnya,doc = '{"a": 1}'::jsonb,doc->'sub'->0->'key' = '"value"'::jsonb, ataudoc->'status' IN ('"active"'::jsonb, '"pending"'::jsonb). Operator perbandingan lainnya seperti<,<=,>, dan>=, serta predikat ekstraksi teks yang menggunakan->>, tidak dipercepat oleh indeks penelusuran JSONB. - Ekspresikan penampungan JSONB menggunakan operator
@>dan<@. Untuk mengetahui informasi selengkapnya, lihat operator JSONB. - Buat kondisi keberadaan kunci menggunakan operator
?,?|, dan?&. Untuk mengetahui informasi selengkapnya, lihat operator JSONB.
- Buat predikat kesetaraan menggunakan operator
Dalam kueri, Anda dapat menyertakan beberapa kondisi JSON dari jenis apa pun dalam indeks penelusuran. Anda juga dapat menyertakan kondisi JSON dalam kombinasi logis menggunakan AND, OR, dan NOT.
Memeriksa penggunaan indeks penelusuran
Untuk memeriksa apakah kueri Anda menggunakan indeks penelusuran, cari node Pemindaian indeks penelusuran dalam rencana eksekusi kueri.
Pembatasan
- Indeks penelusuran, termasuk indeks penelusuran JSON dan JSONB, hanya digunakan dalam transaksi hanya baca. Spanner mungkin menggunakan indeks sekunder yang relevan dalam transaksi baca-tulis. Jika Anda mencoba memaksa penggunaan a
indeks penelusuran dalam transaksi baca-tulis, error berikut akan terjadi:
ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default." - Upaya untuk menyimpan dokumen JSON tertentu yang berukuran besar atau sangat kompleks dalam indeks penelusuran mungkin akan menampilkan error
too many search token bytes. Ukuran token output dari dokumen JSON ini harus lebih kecil dari 10 MB. Jika Anda tidak memerlukan seluruh dokumen untuk dapat ditelusuri, pertimbangkan untuk mengekstrak subset dokumen yang lebih kecil (misalnya, dengan menggunakan kolom yang dihasilkan) dan menelusuri kolom tersebut.
Langkah berikutnya
- Pelajari tokenisasi dan tokenizer.
- Pelajari indeks penelusuran.
- Pelajari cara mengindeks data JSON.
- Pelajari cara mengindeks data JSONB.