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

field_name

Nama bidang JSON Anda dalam skema koleksi.

"metadata"

index_type

Harus "AUTOINDEX" atau "INVERTED" untuk pengindeksan JSON.

"AUTOINDEX"

index_name

Pengenal unik untuk indeks ini.

"category_index"

json_path

Jalur ke kunci yang ingin diindeks dalam objek JSON Anda.

  • Kunci tingkat teratas: 'metadata["category"]'

  • Kunci bersarang: 'metadata["supplier"]["contact"]["email"]'

  • Seluruh objek JSON: "metadata"

  • Sub-objek: 'metadata["supplier"]'

json_cast_type

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.

"VARCHAR"

json_cast_function

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

"STRING_TO_DOUBLE"

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

BOOL / bool

Digunakan untuk mengindeks nilai boolean, sehingga memungkinkan kueri yang memfilter kondisi benar/salah.

true, false

DOUBLE / double

Digunakan untuk nilai numerik, termasuk bilangan bulat dan bilangan floating-point. Memungkinkan pemfilteran berdasarkan rentang atau kesetaraan (mis., >, <, ==).

42, 99.99

VARCHAR / varchar

Digunakan untuk mengindeks nilai string, yang umum digunakan untuk data berbasis teks seperti nama, kategori, atau ID.

"electronics", "BrandA"

ARRAY_BOOL / array_bool

Digunakan untuk mengindeks larik nilai boolean.

[true, false, true]

ARRAY_DOUBLE / array_double

Digunakan untuk mengindeks larik nilai numerik.

[1.2, 3.14, 42]

ARRAY_VARCHAR / array_varchar

Digunakan untuk mengindeks larik string, yang ideal untuk daftar tag atau kata kunci.

["tag1", "tag2", "tag3"]

JSON / json

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_TO_DOUBLE / string_to_double

String → Numerik (ganda)

Ubah "99.99" menjadi 99.99

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.