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 Offset8 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)
}