Pencarian Kemiripan Vektor
Pada topik ini, dijelaskan bagaimana melakukan pencarian entitas dalam Milvus.
Pencarian kemiripan vektor di Milvus menghitung jarak antara vektor kueri dan vektor dalam koleksi, dan mengembalikan hasil yang paling mirip. Anda juga dapat melakukan pencarian campuran dengan menentukan ekspresi boolean untuk menyaring bidang skalar atau bidang kunci utama.
Contoh berikut ini menggambarkan bagaimana melakukan pencarian kemiripan vektor pada dataset 2000 baris, yang terdiri dari ID buku (kunci utama), frekuensi kata (bidang skalar), dan deskripsi buku (bidang vektor). Ini mensimulasikan skenario pencarian buku tertentu berdasarkan deskripsi yang divetorisasi. Milvus akan mengembalikan hasil yang paling mirip berdasarkan vektor kueri yang Anda tentukan dan parameter pencarian.
Memuat Koleksi
Sebelum melakukan pencarian kemiripan vektor, Milvus melakukan semua operasi pencarian dan kueri di memori. Harap muat koleksi ke memori sebelum melakukan pencarian kemiripan vektor.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("gagal memuat koleksi:", err.Error())
}
Menyiapkan Parameter Pencarian
Siapkan parameter yang sesuai untuk skenario pencarian Anda. Contoh berikut ini mendefinisikan penggunaan jarak Euclidean untuk menghitung jarak dan mengambil vektor dari sepuluh klaster terdekat yang dibangun oleh indeks IVF_FLAT.
sp, _ := entity.NewIndexIvfFlatSearchParam( // Fungsi NewIndex*SearchParam
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parameter | Deskripsi | Opsi |
---|---|---|
Fungsi NewIndex*SearchParam |
Fungsi untuk membuat entity.SearchParam berdasarkan berbagai jenis indeks. |
Untuk Vektor Float: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Untuk Vektor Biner: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Parameter pencarian spesifik indeks yang dikembalikan oleh fungsi sebelumnya. | Lihat Indeks Vektor untuk detailnya. |
opt |
Opsi pencarian ANN. | - Limit : Tentukan jumlah entitas yang akan dikembalikan. - Offset : Tentukan jumlah entitas yang akan dilewati selama pencarian. Jumlah parameter ini dan Limit harus kurang dari 16384. Misalnya, jika Anda ingin query ke-9 dan ke-10 tetangga terdekat dari vektor, atur Limit menjadi 2 dan Offset menjadi 8 . - ConsistencyLevel : Tentukan tingkat konsistensi yang diterapkan selama pencarian. - Ignore Growing : Menunjukkan apakah akan mengabaikan segmen pertumbuhan dalam pencarian kemiripan. Nilai defaultnya adalah False , menunjukkan bahwa pencarian melibatkan segmen pertumbuhan. |
Melakukan Pencarian Vektor
Melakukan pencarian vektor menggunakan Milvus. Untuk mencari dalam partisi tertentu, harap tentukan daftar nama partisi.
Milvus mendukung pengaturan tingkat konsistensi untuk pencarian. Contoh dalam topik ini mengatur tingkat konsistensi ke Kuat
. Anda juga dapat mengatur tingkat konsistensi ke Terbatas
, Sesi
, atau Akhirnya
. Untuk informasi lebih lanjut tentang empat tingkat konsistensi dalam Milvus, lihat Konsistensi.
hasilPencarian, err := milvusClient.Search(
context.Background(), // ctx
"book", // CollectionName
[]string{}, // partitionNames
"", // expr
[]string{"book_id"}, // outputFields
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
"book_intro", // vectorField
entity.L2, // metricType
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Gagal melakukan pencarian koleksi:", err.Error())
}
Parameter | Deskripsi | Opsi |
---|---|---|
ctx |
Konteks yang digunakan untuk mengontrol proses panggilan API | TDK |
CollectionName |
Nama koleksi yang akan dimuat | TDK |
partitionNames |
Daftar nama partisi yang akan dimuat. Jika kosong, cari semua partisi | TDK |
expr |
Ekspresi boolean untuk penyaringan properti | Lihat Aturan Ekspresi Boolean untuk informasi lebih detail |
output_fields |
Nama-nama bidang yang akan dikembalikan | TDK |
vectors |
Vektor yang akan dicari | TDK |
vectorField |
Nama bidang yang akan dicari | TDK |
metricType |
Jenis metrik yang digunakan untuk pencarian | Parameter ini harus sama dengan jenis metrik yang digunakan untuk membangun indeks |
topK |
Jumlah hasil yang akan dikembalikan. Jumlah nilai ini dan offset dalam opts harus kurang dari 16.384 |
TDK |
sp |
entity.SearchParam khusus untuk indeks |
TDK |
Periksa nilai kunci utama dan jarak vektor yang paling mirip.
fmt.Printf("%#v\n", hasilPencarian)
for _, sr := range hasilPencarian {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Setelah pencarian selesai, lepaskan koleksi yang dimuat di Milvus untuk mengurangi konsumsi memori.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // CollectionName
)
if err != nil {
log.Fatal("Gagal melepaskan koleksi:", err.Error())
}
Batasan
Fitur | Batas Maksimum |
---|---|
Panjang nama koleksi | 255 karakter |
Jumlah partisi dalam sebuah koleksi | 4.096 |
Jumlah bidang dalam sebuah koleksi | 256 |
Jumlah shard dalam sebuah koleksi | 256 |
Dimensi vektor | 32.768 |
Top K | 16.384 |
Jumlah vektor input target | 16.384 |
Melakukan Pencarian Campuran
Pencarian campuran pada dasarnya adalah pencarian vektor dengan penyaringan atribut. Dengan menentukan ekspresi boolean untuk menyaring bidang skalar atau bidang kunci primer, Anda dapat membatasi pencarian berdasarkan kondisi-kondisi tertentu.
Contoh berikut menunjukkan bagaimana melakukan pencarian campuran berdasarkan pencarian vektor biasa. Misalkan Anda ingin mencari buku-buku tertentu berdasarkan pengenalan tervektorisasi dari buku-buku tersebut, tetapi hanya ingin mengambil buku-buku dalam rentang jumlah kata tertentu. Anda kemudian dapat menyaring bidang word_count
dengan menentukan ekspresi boolean dalam parameter pencarian. Milvus hanya akan mencari vektor yang mirip dalam entitas yang cocok dengan ekspresi tersebut.
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
hasilPencarian, err := milvusClient.Search(
context.Background(),
"book",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("Gagal melakukan pencarian koleksi:", err.Error())
}
Periksa hasil yang dikembalikan.
fmt.Printf("%#v\n", hasilPencarian)
for _, sr := range hasilPencarian {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}