Indeks Bidang StructArray

Buat indeks pada subbidang StructArray sebelum menjalankan pencarian vektor atau mempercepat penyaringan skalar. Untuk bidang StructArray, target indeks adalah jalur subbidang, seperti chunks[emb_list_vector], chunks[emb], atau chunks[section].

Halaman ini menggunakan koleksi ` tech_articles ` dari "Membuat Bidang StructArray". Bidang StructArray ` chunks ` berisi subbidang skalar untuk penyaringan dan subbidang vektor untuk pencarian.

Sebelum Anda mulai

Pastikan skema koleksi sudah berisi bidang StructArray " chunks " dan data telah dimasukkan.

Jalur subbidangJenisTujuan indeks
chunks[emb_list_vector]FLOAT_VECTORPencarian EmbeddingList dengan metrik MAX_SIM*.
chunks[emb]FLOAT_VECTORPencarian tingkat elemen dengan metrik vektor biasa.
chunks[section]VARCHARPenyaringan kategorikal.
chunks[quality_score]FLOATPenyaringan numerik dan predikat bergaya rentang.
chunks[has_code]BOOLPenyaringan Boolean.

Sebuah bidang vektor atau subbidang vektor hanya menerima satu indeks. Jika Anda memerlukan pencarian EmbeddingList dan pencarian tingkat elemen, buat dua subbidang vektor terpisah dan indekskan masing-masing secara terpisah. Pada halaman ini, chunks[emb_list_vector] diindeks untuk pencarian EmbeddingList, dan chunks[emb] diindeks untuk pencarian tingkat elemen.

Pilih indeks

Gunakan mode pencarian untuk memilih keluarga metrik vektor.

Tujuan pencarian atau penyaringanJalur targetApa yang harus dipilih
Pencarian EmbeddingListchunks[emb_list_vector]Keluarga metrik " MAX_SIM* ".
Pencarian vektor tingkat elemenchunks[emb]Keluarga metrik vektor biasa, seperti COSINE, IP, atau L2.
Saring berdasarkan string atau kategorichunks[section]Indeks skalar yang didukung oleh target Anda.
Saring berdasarkan rentang numerikchunks[quality_score], chunks[page]Indeks skalar yang didukung oleh target Anda.
Saring berdasarkan nilai booleanchunks[has_code]Indeks skalar yang didukung oleh target Anda.

Pencarian EmbeddingList memperlakukan vektor-vektor dalam subbidang vektor StructArray sebagai daftar embedding dan mengembalikan hasil tingkat entitas. Pencarian tingkat elemen mencari setiap elemen Struct secara terpisah dan dapat mengembalikan offset elemen yang cocok.

Membuat indeks vektor

Contoh berikut membuat dua indeks vektor. Indeks pertama menggunakan metrik " MAX_SIM* " untuk pencarian EmbeddingList. Indeks kedua menggunakan metrik vektor biasa untuk pencarian tingkat elemen.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

index_params = client.prepare_index_params()

# Index for EmbeddingList search.
index_params.add_index(
    field_name="chunks[emb_list_vector]",
    index_name="chunks_emb_list_max_sim",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 200,
    },
)

# Index for element-level search.
index_params.add_index(
    field_name="chunks[emb]",
    index_name="chunks_emb_cosine",
    index_type="HNSW",
    metric_type="COSINE",
    params={
        "M": 16,
        "efConstruction": 200,
    },
)

client.create_index(
    collection_name="tech_articles",
    index_params=index_params,
)

Peringatan Jangan membuat indeks MAX_SIM* dan indeks metrik vektor biasa pada subbidang vektor yang sama. Jika kedua mode pencarian diperlukan, tulis vektor ke dua subbidang vektor terpisah dan buat satu indeks pada setiap subbidang.

Buat indeks skalar

Buat indeks skalar pada subbidang skalar StructArray saat Anda menggunakannya dalam filter. Gunakan sintaks jalur structArray[subfield] yang sama.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="chunks[section]",
    index_name="chunks_section_inverted",
    index_type="INVERTED",
)

index_params.add_index(
    field_name="chunks[has_code]",
    index_name="chunks_has_code_inverted",
    index_type="INVERTED",
)

index_params.add_index(
    field_name="chunks[quality_score]",
    index_name="chunks_quality_score_sort",
    index_type="STL_SORT",
)

index_params.add_index(
    field_name="chunks[page]",
    index_name="chunks_page_sort",
    index_type="STL_SORT",
)

client.create_index(
    collection_name="tech_articles",
    index_params=index_params,
)

Indeks skalar bersifat opsional tetapi berguna ketika subbidang skalar StructArray sering muncul dalam filter, seperti element_filter(chunks, $[quality_score] > 0.9) atau MATCH_ANY(chunks, $[section] == "index").

Kompatibilitas metrik indeks

Gunakan tabel berikut untuk memilih jenis indeks dan jenis metrik untuk subbidang vektor StructArray. Mulailah dari target, lalu pilih keluarga metrik berdasarkan mode pencarian.

Pilih jenis indeks Milvus dan jenis metrik dari tabel kompatibilitas berikut.

Pencarian EmbeddingList menggunakan metrik MAX_SIM*. Pencarian ini memperlakukan vektor dalam subbidang vektor StructArray sebagai daftar embedding dan mengembalikan hasil tingkat entitas.

Tipe data subbidang vektorJenis indeksJenis metrik
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORIVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANNMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2
BINARY_VECTORHNSWMAX_SIM_HAMMING, MAX_SIM_JACCARD

Pencarian tingkat elemen menggunakan metrik vektor biasa. Pencarian ini memeriksa setiap elemen Struct secara terpisah dan dapat mengembalikan offset elemen yang cocok.

Tipe data subbidang vektorJenis indeksJenis metrik
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTORFLAT, IVF_FLAT, IVF_FLAT_CC, IVF_SQ8, IVF_SQ_CC, IVF_PQ, SCANN, IVF_RABITQ, IVF_RABITQ_FASTSCAN, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANNL2, IP, COSINE
INT8_VECTORHNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQL2, IP, COSINE
BINARY_VECTORHNSWHAMMING, JACCARD
BINARY_VECTORBIN_FLATHAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD
BINARY_VECTORBIN_IVF_FLATHAMMING, JACCARD

Untuk dukungan khusus versi dan batasan lainnya, lihat Batasan StructArray.

Verifikasi indeks

Setelah membuat indeks, deskripsikan koleksi atau daftar indeks untuk memastikan bahwa jalur subbidang yang diharapkan telah diindeks.

indexes = client.list_indexes(
    collection_name="tech_articles",
)

print(indexes)

Anda juga dapat mendeskripsikan indeks tertentu jika versi SDK Anda menyediakan API deskripsi indeks.

index = client.describe_index(
    collection_name="tech_articles",
    index_name="chunks_emb_cosine",
)

print(index)

Aturan indeks

AturanPenjelasan
Gunakan sintaks jalur untuk indeks subbidang.chunks[emb], bukan emb atau chunks.emb.
Satu subbidang vektor hanya dapat memiliki satu indeks.Gunakan subbidang vektor terpisah jika Anda memerlukan keluarga metrik yang berbeda.
Gunakan metrik MAX_SIM* untuk pencarian EmbeddingList.Data kueri EmbeddingList memerlukan indeks yang dibangun dengan metrik MAX_SIM*.
Gunakan metrik vektor biasa untuk pencarian tingkat elemen.Pencarian tingkat elemen menggunakan data kueri vektor biasa dan metrik seperti COSINE, IP, atau L2.
Indeks subbidang skalar yang muncul dalam filter.Gunakan tipe indeks skalar yang didukung oleh target Anda.
Perhatikan batasan bidang vektor.Jumlah total bidang vektor dan subbidang vektor dibatasi. Lihat Batasan StructArray sebelum menambahkan banyak subbidang vektor.

Kesalahan umum

  • Membuat indeks pada ` chunks.emb ` alih-alih ` chunks[emb]`.

  • Hanya membuat indeks MAX_SIM* dan kemudian mencoba menjalankan pencarian tingkat elemen pada subbidang yang sama.

  • Hanya membuat indeks vektor biasa, lalu mencoba menjalankan pencarian EmbeddingList pada subbidang yang sama.

  • Menggunakan kembali satu subbidang vektor untuk metrik MAX_SIM* dan vektor biasa.

  • Melupakan indeks skalar untuk filter StructArray yang sering digunakan.

  • Mengindeks subfield StructArray yang tidak ada dalam skema Struct.

Langkah selanjutnya

  1. Untuk menjalankan pencarian EmbeddingList tingkat entitas atau pencarian vektor tingkat elemen, baca Pencarian Vektor Dasar dengan StructArray.

  2. Untuk menyaring subbidang skalar StructArray selama pencarian, baca " Pencarian yang Disaring dengan StructArray".

  3. Untuk meninjau batasan indeks dan metrik, baca Batasan StructArray.

Diterjemahkan olehDeepL

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?