Vektör Benzerlik Araması
Bu konu, Milvus'ta varlık aramasının nasıl yapıldığını tanıtır.
Milvus'ta vektör benzerlik araması, sorgu vektörü ile koleksiyondaki vektörler arasındaki mesafeyi hesaplar ve en benzer sonuçları döndürür. Ayrıca, skalara sahip alanları veya birincil anahtar alanlarını filtrelemek için boolean bir ifade belirterek karma arama da yapabilirsiniz.
Aşağıdaki örnek, kitap kimlikleri (birincil anahtar), kelime frekansı (skalar alan) ve kitap açıklamaları (vektör alanı) içeren 2000 satırlık bir veri setinde vektör benzerlik araması nasıl yapılacağını göstermektedir. Bu, vektörleştirilmiş açıklamalara dayalı belirli kitapları arama senaryosunu simüle eder. Milvus, tanımladığınız sorgu vektörü ve arama parametrelerine göre en benzer sonuçları döndürecektir.
Koleksiyonu Yükle
Vektör benzerlik araması yapmadan önce, Milvus tüm arama ve sorgu işlemlerini bellekte gerçekleştirir. Lütfen vektör benzerlik araması yapmadan önce koleksiyonu belleğe yükleyin.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("koleksiyon yüklenemedi:", err.Error())
}
Arama Parametrelerini Hazırla
Arama senaryonuza uygun parametreleri hazırlayın. Aşağıdaki örnek, mesafeyi hesaplamak için Öklid mesafesini kullanmayı ve IVF_FLAT endeksini kullanarak oluşturulmuş on en yakın kümeden vektörleri almayı tanımlamaktadır.
sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parametre | Açıklama | Seçenekler |
---|---|---|
NewIndex*SearchParam func |
Farklı endeks türlerine göre entity.SearchParam oluşturmak için kullanılan işlev. |
Float Vektörler için: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Binary Vektörler için: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Önceki işlev tarafından döndürülen endeks özgü arama parametreleri. | Ayrıntılar için Vektör Endeksi'ne bakın. |
opt |
ANN araması için seçenekler. | - Limit : Döndürülecek varlık sayısını belirtir. - Offset : Arama sırasında atlanacak varlık sayısını belirtir. Bu parametre ve Limit 'in toplamı 16384'ten az olmalıdır. Örneğin, bir vektörün 9. ve 10. en yakın komşularını sorgulamak istiyorsanız, Limit 'i 2 olarak ve Offset 'ı 8 olarak ayarlayın. - ConsistencyLevel : Arama sırasında uygulanan tutarlılık seviyesini belirtir. - Ignore Growing : Benzerlik aramasında büyüyen segmentleri görmezden gelip gizleyip gizlemediğini gösterir. Varsayılan değer False olup, aramanın büyüyen segmentleri içerdiğini gösterir. |
Vektör Araması Yap
Milvus kullanarak vektör araması yapın. Belirli bir bölümde arama yapmak için lütfen bölüm adı listesini belirtin.
Milvus, arama için bir tutarlılık seviyesi belirlemeyi destekler. Bu konudaki örnekte tutarlılık seviyesi Güçlü
olarak ayarlanmıştır. Ayrıca tutarlılık seviyesini Sınırlı
, Oturum
, veya Sonunda
olarak da ayarlayabilirsiniz. Milvus'taki dört tutarlılık seviyesi hakkında daha fazla bilgi için Tutarlılık başlığına bakın.
searchResult, err := milvusClient.Search(
context.Background(), // ctx
"book", // CollectionName
[]string{}, // bölümAdları
"", // expr
[]string{"book_id"}, // çıktıAlanları
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vektörler
"book_intro", // vektörAlanı
entity.L2, // metrikTip
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Koleksiyon araması başarısız oldu:", err.Error())
}
Parametre | Açıklama | Seçenekler |
---|---|---|
ctx |
API çağrısı sürecini kontrol etmek için kullanılan bağlama | Yok |
CollectionName |
Yüklenecek koleksiyonun adı | Yok |
bölümAdları |
Yüklenecek bölüm adlarının listesi. Boş ise tüm bölümleri arar | Yok |
expr |
Özellikleri filtrelemek için boolean ifadesi | Ayrıntılı bilgi için Boolean İfade Kurallarına bakın |
çıktı_ alanları |
Döndürülecek alanların adları | Yok |
vektörler |
Aranacak vektörler | Yok |
vektörAlanı |
Aranacak alanın adı | Yok |
metrikTip |
Arama için kullanılan metrik türü | Bu parametre, endeks oluştururken kullanılan metrik türüyle aynı olmalıdır |
topK |
Döndürülecek sonuç sayısı. Bu değer ile opts içindeki offset 'in toplamı 16384'ten az olmalıdır |
Yok |
sp |
Endeks için özgü entity.SearchParam |
Yok |
En benzer vektörlerin birincil anahtar değerlerini ve mesafelerini kontrol edin.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Arama tamamlandıktan sonra, bellek tüketimini azaltmak için Milvus'ta yüklenen koleksiyonu serbest bırakın.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // CollectionName
)
if err != nil {
log.Fatal("Koleksiyonun serbest bırakılması başarısız oldu:", err.Error())
}
Sınırlamalar
Özellik | Maksimum Limit |
---|---|
Koleksiyon adı uzunluğu | 255 karakter |
Bir koleksiyonda bölüm sayısı | 4,096 |
Bir koleksiyonda alan sayısı | 256 |
Bir koleksiyonda parça sayısı | 256 |
Vektörlerin boyutu | 32,768 |
En Yüksek K | 16,384 |
Hedef giriş vektör sayısı | 16,384 |
Karışık Arama Yapma
Karışık arama aslında öznitelik filtrelemesi ile birlikte vektör aramasıdır. Skaler alanları veya birincil anahtar alanlarını filtrelemek için boolean bir ifade belirterek belirli koşullara göre aramayı sınırlayabilirsiniz.
Aşağıdaki örnek, normal vektör aramasına dayalı olarak karışık arama nasıl yapılacağını göstermektedir. Kitapların vektörleştirilmiş girişlerine göre belirli kitapları aramak istediğinizi varsayalım, ancak yalnızca belirli kelime sayısı aralığında olan kitapları almak istiyorsunuz. Ardından arama parametrelerinde bir boolean ifadesi belirterek word_count
alanını filtreleyebilirsiniz. Milvus, ifadeyi karşılayan varlıklarda benzer vektörler arayacaktır.
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
searchResult, 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("Koleksiyon araması başarısız oldu:", err.Error())
}
Döndürülen sonuçları kontrol edin.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}