جستجوی مشابهت بردار

در این بخش، نحوه انجام جستجوی داده‌ها در Milvus معرفی می‌شود.

جستجوی مشابهت بردار در Milvus مسافت بین بردار پرس و جو و بردارهای موجود در مجموعه داده را محاسبه کرده و نتایج مشابهت‌های بیشترین را برمی‌گرداند. همچنین می‌توانید با مشخص کردن یک عبارت بولیانی جستجو ترکیبی انجام دهید و به فیلدهای عددی یا کلیدهای اصلی فیلتر اعمال کنید.

در مثال زیر نحوه انجام جستجوی مشابهت بردار بر روی مجموعه‌داده‌ای ۲۰۰۰ ردیفی، شامل شناسه کتاب‌ها (کلید اصلی)، فراوانی کلمات (فیلد عددی) و توضیحات کتاب (فیلد بردار) را مشاهده می‌کنید. این شبیه‌سازی به دنبال جستجوی کتاب‌های خاص بر اساس توصیفات برداری است. Milvus بر اساس بردار پرس و جوی تعریف‌شده و پارامترهای جستجو، نتایج بیشترین مشابهت را برمی‌گرداند.

بارگذاری مجموعه داده

قبل از انجام جستجوی مشابهت بردار، Milvus تمام عملیات جستجو و پرس و جو را در حافظه اجرا می‌کند. لطفاً قبل از انجام جستجوی مشابهت بردار، مجموعه داده را در حافظه بارگذاری کنید.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // نام مجموعه
  false                   // ناهمزمان
)
if err != nil {
  log.Fatal("خطا در بارگذاری مجموعه:", err.Error())
}

آماده‌سازی پارامترهای جستجو

پارامترهای مناسب برای سناریوی جستجوی شما را آماده‌کنید. در مثال زیر، برای محاسبه مسافت از فاصله اقلیدسی استفاده کرده و بردارها را از ده خوشه نزدیک به ساخته شده توسط شاخص IVF_FLAT بازیابی می‌کند.

sp, _ := entity.NewIndexIvfFlatSearchParam( // تابع NewIndex*SearchParam
    10,                                  // پارامتر جستجو
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
پارامتر توضیحات گزینه‌ها
تابع NewIndex*SearchParam تابع برای ایجاد entity.SearchParam بر اساس انواع مختلف اشاره‌گرها. برای بردارهای عددی: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) برای بردارهای دودویی: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp پارامترهای جستجوی مخصوص اشاره‌گری که توسط تابع قبلی برگردانده شده است. جهت جزئیات به فهرست ایشاره‌گر بردار مراجعه کنید.
opt گزینه‌های جستجوی ANN. - Limit: تعیین تعداد موجودیت‌هایی که برگردانده می‌شوند. - Offset: تعیین تعداد موجودیت‌های صرف‌نظرشده در هنگام جستجو. مجموع این پارامتر و Limit باید کمتر از 16384 باشد. به عنوان مثال، اگر می‌خواهید همسایه‌های نهم و دهم یک بردار را پرس‌وجو کنید، Limit را به 2 و Offset را به 8 تنظیم کنید. - ConsistencyLevel: تعیین سطح پایداری که در هنگام جستجو اعمال می‌شود. - Ignore Growing: نشان می‌دهد که آیا باید بخش‌های در حال رشد در جستجوی مشابهت را نادیده بگیرد یا خیر. مقدار پیش‌فرض False است که نشان می‌دهد جستجو شامل بخش‌های در حال رشد است.

انجام جستجوی برداری

برای انجام جستجوی برداری از Milvus استفاده کنید. برای جستجو در یک بخش خاص، لطفاً نام بخش را مشخص کنید.

Milvus امکان تنظیم سطح یکپارچگی برای جستجو را ارائه می‌دهد. در این مثال، سطح یکپارچگی به قوی تنظیم شده است. شما همچنین می‌توانید سطح یکپارچگی را به محدود، جلسه یا سرانجاماً تنظیم کنید. برای اطلاعات بیشتر درباره چهار سطح یکپارچگی در Milvus، به بخش یکپارچگی مراجعه کنید.

searchResult, 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("Failed to search collection:", err.Error())
}
پارامتر توضیحات گزینه‌ها
ctx کانتکست استفاده شده برای کنترل فرآیند فراخوانی API یکان
CollectionName نام مجموعه برای بارگذاری یکان
partitionNames لیست نام‌های بخش‌ها برای بارگذاری. اگر خالی باشد، همه‌ی بخش‌ها جستجو می‌شوند یکان
expr عبارت منطقی برای فیلتر کردن ویژگی‌ها برای اطلاعات دقیق درباره قوانین عبارت منطقی، به قوانین عبارت منطقی مراجعه شود
output_fields نام‌های فیلدهای بازگردانده شده یکان
vectors بردارهای جستجو شده یکان
vectorField نام فیلدی که جستجو خواهد شد یکان
metricType نوع متریک مورد استفاده برای جستجو این پارامتر باید همانند نوع متریکی باشد که برای ساخت اندیس استفاده شده است
topK تعداد نتایج بازگردانده شده. مجموع این مقدار و offset در opts باید کمتر از 16384 باشد یکان
sp entity.SearchParam ویژه‌ای برای اندیس یکان

پس از اتمام جستجو، مجموعه بارگذاری شده در Milvus را برای کاهش مصرف حافظه آزاد کنید.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("Failed to release collection:", err.Error())
}

محدودیت‌ها

قابلیت حداکثر محدودیت
طول نام مجموعه 255 کاراکتر
تعداد بخش‌ها در یک مجموعه 4,096
تعداد فیلدها در یک مجموعه 256
تعداد تکه‌بندی‌ها در یک مجموعه 256
بعدیت بردارها 32,768
برترین K 16,384
تعداد بردارهای ورودی هدف 16,384

انجام جستجوی ترکیبی

جستجوی ترکیبی در واقع یک جستجوی برداری با فیلتر کردن ویژگی‌های ویژه است. با مشخص کردن یک عبارت منطقی برای فیلتر کردن فیلدهای کلمه‌ای یا فیلدهای کلید اصلی، می‌توانید جستجو را بر اساس شرایط خاص محدود کنید.

مثال زیر نشان می‌دهد چگونه می‌توانید جستجوی ترکیبی براساس جستجوی معمولی برداری انجام دهید. فرض کنید می‌خواهید بر اساس متن معرفی کتاب‌ها جستجو کنید، اما تنها می‌خواهید کتاب‌هایی را در محدوده تعداد کلمات خاص جستجو کنید. در این صورت می‌توانید فیلد word_count را با مشخص کردن یک عبارت منطقی در پارامترهای جستجو، فیلتر کنید. Milvus تنها در داخل موجودیت‌هایی که با عبارت منطقی مطابقت دارند، برای بردارهای مشابه جستجو خواهد کرد.

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("Failed to search collection:", err.Error())
}

نتایج بازگردانده شده را بررسی کنید.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}