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 subbidang | Jenis | Tujuan indeks |
|---|---|---|
chunks[emb_list_vector] | FLOAT_VECTOR | Pencarian EmbeddingList dengan metrik MAX_SIM*. |
chunks[emb] | FLOAT_VECTOR | Pencarian tingkat elemen dengan metrik vektor biasa. |
chunks[section] | VARCHAR | Penyaringan kategorikal. |
chunks[quality_score] | FLOAT | Penyaringan numerik dan predikat bergaya rentang. |
chunks[has_code] | BOOL | Penyaringan 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 penyaringan | Jalur target | Apa yang harus dipilih |
|---|---|---|
| Pencarian EmbeddingList | chunks[emb_list_vector] | Keluarga metrik " MAX_SIM* ". |
| Pencarian vektor tingkat elemen | chunks[emb] | Keluarga metrik vektor biasa, seperti COSINE, IP, atau L2. |
| Saring berdasarkan string atau kategori | chunks[section] | Indeks skalar yang didukung oleh target Anda. |
| Saring berdasarkan rentang numerik | chunks[quality_score], chunks[page] | Indeks skalar yang didukung oleh target Anda. |
| Saring berdasarkan nilai boolean | chunks[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
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 vektor | Jenis indeks | Jenis metrik |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | IVF_FLAT, IVF_FLAT_CC, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, DISKANN | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | MAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2 |
BINARY_VECTOR | HNSW | MAX_SIM_HAMMING, MAX_SIM_JACCARD |
Pencarian tingkat elemen
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 vektor | Jenis indeks | Jenis metrik |
|---|---|---|
FLOAT_VECTOR, FLOAT16_VECTOR, BFLOAT16_VECTOR | FLAT, 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, DISKANN | L2, IP, COSINE |
INT8_VECTOR | HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ | L2, IP, COSINE |
BINARY_VECTOR | HNSW | HAMMING, JACCARD |
BINARY_VECTOR | BIN_FLAT | HAMMING, JACCARD, SUBSTRUCTURE, SUPERSTRUCTURE, MHJACCARD |
BINARY_VECTOR | BIN_IVF_FLAT | HAMMING, 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
| Aturan | Penjelasan |
|---|---|
| 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
Untuk menjalankan pencarian EmbeddingList tingkat entitas atau pencarian vektor tingkat elemen, baca Pencarian Vektor Dasar dengan StructArray.
Untuk menyaring subbidang skalar StructArray selama pencarian, baca " Pencarian yang Disaring dengan StructArray".
Untuk meninjau batasan indeks dan metrik, baca Batasan StructArray.