جستجوی مشابهت بردار
در این بخش، نحوه انجام جستجوی دادهها در 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)
}