Pengindeksan JSON
Bidang JSON menyediakan cara yang fleksibel untuk menyimpan metadata terstruktur di Milvus. Tanpa pengindeksan, kueri pada bidang JSON memerlukan pemindaian koleksi penuh, yang menjadi lambat seiring dengan bertambahnya kumpulan data Anda. Pengindeksan JSON memungkinkan pencarian cepat dengan membuat indeks di dalam data JSON Anda.
Pengindeksan JSON sangat ideal untuk:
Skema terstruktur dengan kunci yang konsisten dan diketahui
Kueri kesetaraan dan rentang pada jalur JSON tertentu
Skenario di mana Anda memerlukan kontrol yang tepat atas kunci mana yang diindeks
Akselerasi kueri yang ditargetkan dengan hemat penyimpanan
Untuk dokumen JSON yang kompleks dengan pola kueri yang beragam, pertimbangkan JSON Shredding sebagai alternatif.
Sintaks pengindeksan JSON
Saat Anda membuat indeks JSON, Anda menentukan:
Jalur JSON: Lokasi persis data yang ingin Anda indeks
Jenis data yang diberikan: Cara menafsirkan dan menyimpan nilai yang diindeks
Konversi tipe opsional: Mengubah data selama pengindeksan jika diperlukan
Berikut ini sintaks untuk mengindeks bidang JSON:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="<json_field_name>", # Name of the JSON field
index_type="AUTOINDEX", # Must be AUTOINDEX or INVERTED
index_name="<unique_index_name>", # Index name
params={
"json_path": "<path_to_json_key>", # Specific key to be indexed within JSON data
"json_cast_type": "<data_type>", # Data type to use when interpreting and indexing the value
# "json_cast_function": "<cast_function>" # Optional: convert key values into a target type at index time
}
)
Parameter |
Deskripsi |
Nilai / Contoh |
|---|---|---|
|
Nama bidang JSON Anda dalam skema koleksi. |
|
|
Harus |
|
|
Pengenal unik untuk indeks ini. |
|
|
Jalur ke kunci yang ingin diindeks dalam objek JSON Anda. |
|
|
Tipe data yang akan digunakan saat menginterpretasikan dan mengindeks nilai. Harus sesuai dengan tipe data sebenarnya dari kunci. Untuk daftar tipe cast yang tersedia, lihat Tipe cast yang didukung di bawah ini. |
|
|
(Opsional ) Mengonversi nilai kunci asli ke tipe target pada waktu indeks. Konfigurasi ini diperlukan hanya jika nilai kunci disimpan dalam format yang salah dan Anda ingin mengonversi tipe data selama pengindeksan. Untuk daftar fungsi cast yang tersedia, lihat Fungsi cast yang didukung di bawah ini. |
|
Tipe cast yang didukung
Milvus mendukung tipe data berikut ini untuk cast pada waktu pengindeksan. Tipe-tipe ini memastikan bahwa data Anda ditafsirkan dengan benar untuk pemfilteran yang efisien.
Tipe Cast |
Deskripsi |
Contoh Nilai JSON |
|---|---|---|
|
Digunakan untuk mengindeks nilai boolean, sehingga memungkinkan kueri yang memfilter kondisi benar/salah. |
|
|
Digunakan untuk nilai numerik, termasuk bilangan bulat dan bilangan floating-point. Memungkinkan pemfilteran berdasarkan rentang atau kesetaraan (mis., |
|
|
Digunakan untuk mengindeks nilai string, yang umum digunakan untuk data berbasis teks seperti nama, kategori, atau ID. |
|
|
Digunakan untuk mengindeks larik nilai boolean. |
|
|
Digunakan untuk mengindeks larik nilai numerik. |
|
|
Digunakan untuk mengindeks larik string, yang ideal untuk daftar tag atau kata kunci. |
|
|
Seluruh objek atau sub-objek JSON dengan inferensi dan perataan tipe otomatis. Mengindeks seluruh objek JSON akan meningkatkan ukuran indeks. Untuk skenario banyak kunci, pertimbangkan Penghancuran JSON. |
Objek JSON apa pun |
Larik harus berisi elemen dengan tipe yang sama untuk pengindeksan yang optimal. Untuk informasi lebih lanjut, lihat Bidang Larik.
Fungsi cast yang didukung
Jika kunci bidang JSON Anda berisi nilai dalam format yang salah (misalnya, angka yang disimpan sebagai string), Anda dapat mengoper fungsi cast ke argumen json_cast_function untuk mengonversi nilai-nilai ini pada waktu pengindeksan.
Fungsi cast tidak peka terhadap huruf besar/kecil. Fungsi-fungsi berikut ini didukung:
Fungsi Cast |
Mengonversi Dari → Ke |
Kasus Penggunaan |
|---|---|---|
|
String → Numerik (ganda) |
Ubah |
Jika konversi gagal (misalnya, string non-numerik), nilai akan dilewati dan tidak diindeks.
Membuat indeks JSON
Bagian ini mendemonstrasikan cara membuat indeks pada berbagai jenis data JSON dengan menggunakan contoh-contoh praktis. Semua contoh menggunakan contoh struktur JSON yang ditunjukkan di bawah ini dan mengasumsikan bahwa Anda telah membuat koneksi ke MilvusClient dengan skema koleksi yang telah didefinisikan dengan benar.
Contoh struktur JSON
{
"metadata": {
"category": "electronics",
"brand": "BrandA",
"in_stock": true,
"price": 99.99,
"string_price": "99.99",
"tags": ["clearance", "summer_sale"],
"supplier": {
"name": "SupplierX",
"country": "USA",
"contact": {
"email": "support@supplierx.com",
"phone": "+1-800-555-0199"
}
}
}
}
Penyiapan dasar
Sebelum membuat indeks JSON, siapkan parameter indeks Anda:
# Prepare index params
index_params = MilvusClient.prepare_index_params()
Contoh 1: Mengindeks kunci JSON sederhana
Buat indeks pada bidang category untuk mengaktifkan penyaringan cepat berdasarkan kategori produk:
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="category_index", # Unique index name
params={
"json_path": 'metadata["category"]', # Path to the JSON key
"json_cast_type": "varchar" # Data cast type
}
)
Contoh 2: Mengindeks kunci bersarang
Buat indeks pada bidang email yang bersarang dalam untuk pencarian kontak pemasok:
# Index the nested key
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="email_index", # Unique index name
params={
"json_path": 'metadata["supplier"]["contact"]["email"]', # Path to the nested JSON key
"json_cast_type": "varchar" # Data cast type
}
)
Contoh 3: Mengonversi tipe data pada saat mengindeks
Terkadang data numerik secara keliru disimpan sebagai string. Gunakan fungsi STRING_TO_DOUBLE cast untuk mengonversi dan mengindeksnya dengan benar:
# Convert string numbers to double for indexing
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX", # Must be set to AUTOINDEX or INVERTED for JSON path indexing
index_name="string_to_double_index", # Unique index name
params={
"json_path": 'metadata["string_price"]', # Path to the JSON key to be indexed
"json_cast_type": "double", # Data cast type
"json_cast_function": "STRING_TO_DOUBLE" # Cast function; case insensitive
}
)
Penting: Jika konversi gagal untuk dokumen apa pun (misalnya, string non-numerik seperti "invalid"), nilai dokumen tersebut akan dikecualikan dari indeks dan tidak akan muncul dalam hasil yang difilter.
Contoh 4: Mengindeks seluruh objek
Mengindeks seluruh objek JSON untuk memungkinkan kueri pada bidang apa pun di dalamnya. Saat Anda menggunakan json_cast_type="JSON", sistem secara otomatis:
Meratakanstruktur JSON: Objek bersarang diubah menjadi jalur datar untuk pengindeksan yang efisien
Menyimpulkan tipe data: Setiap nilai secara otomatis dikategorikan sebagai numerik, string, boolean, atau tanggal berdasarkan isinya
Menciptakan cakupan yang komprehensif: Semua kunci dan jalur bersarang di dalam objek menjadi dapat dicari
Untuk contoh struktur JSON di atas, indeks seluruh objek metadata:
# Index the entire JSON object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="metadata_full_index",
params={
"json_path": "metadata",
"json_cast_type": "JSON"
}
)
Anda juga dapat mengindeks hanya sebagian dari struktur JSON, seperti semua informasi supplier:
# Index a sub-object
index_params.add_index(
field_name="metadata",
index_type="AUTOINDEX",
index_name="supplier_index",
params={
"json_path": 'metadata["supplier"]',
"json_cast_type": "JSON"
}
)
Menerapkan konfigurasi indeks
Setelah menentukan semua parameter indeks Anda, terapkan parameter tersebut ke koleksi Anda:
# Apply all index configurations to the collection
MilvusClient.create_index(
collection_name="your_collection_name",
index_params=index_params
)
Setelah pengindeksan selesai, kueri bidang JSON Anda akan secara otomatis menggunakan indeks ini untuk kinerja yang lebih cepat.
PERTANYAAN UMUM
Apa yang terjadi jika ekspresi filter kueri menggunakan jenis yang berbeda dari jenis cast yang diindeks?
Jika ekspresi filter Anda menggunakan tipe yang berbeda dari tipe indeks json_cast_type, Milvus tidak akan menggunakan indeks dan mungkin akan kembali ke pemindaian brute-force yang lebih lambat jika datanya memungkinkan. Untuk performa terbaik, selalu selaraskan ekspresi filter Anda dengan tipe cast dari indeks. Sebagai contoh, jika indeks numerik dibuat dengan json_cast_type="double", hanya kondisi filter numerik yang akan memanfaatkan indeks.
Saat membuat indeks JSON, bagaimana jika kunci JSON memiliki tipe data yang tidak konsisten di berbagai entitas?
Tipe yang tidak konsisten dapat menyebabkan pengindeksan parsial. Misalnya, jika bidang metadata["price"] disimpan sebagai angka (99.99) dan string ("99.99") dan Anda membuat indeks dengan json_cast_type="double", hanya nilai numerik yang akan diindeks. Entri berbentuk string akan dilewati dan tidak akan muncul dalam hasil filter.
Dapatkah saya membuat beberapa indeks pada kunci JSON yang sama?
Tidak, setiap kunci JSON hanya mendukung satu indeks. Anda harus memilih satu json_cast_type yang sesuai dengan data Anda. Namun, Anda dapat membuat indeks pada seluruh objek JSON dan indeks pada kunci bersarang di dalam objek tersebut.
Apakah bidang JSON mendukung pengaturan nilai default?
Tidak, bidang JSON tidak mendukung nilai default. Namun, Anda dapat menetapkan nullable=True saat mendefinisikan bidang untuk mengizinkan entri kosong. Untuk informasi lebih lanjut, lihat Nullable & Default.