اجرای پرس و جو‌های شرطی

در این بخش، نحوه‌ی اجرای پرس و جو‌های شرطی معرفی می‌شود که شبیه به شرایط WHERE SQL است.

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

در قطعه کد زیر، نشان داده شده است که چگونه یک پرس‌وجو را بر روی مجموعه‌ای از 2000 رکورد انجام داده و شامل شناسه کتاب (کلید اصلی)، تعداد کلمات (فیلد اسکالر) و معرفی کتاب (فیلد برداری) است. این قطعه کد به شبیه‌سازی پرس‌وجو برای کتاب‌های خاص بر اساس شناسه آن‌ها می‌پردازد.

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

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

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

اجرای پرس‌وجو

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

Milvus از تنظیم سطوح هم‌ترازی برای پرس‌وجو‌ها پشتیبانی می‌کند. این نمونه سطح هم‌ترازی را به قوی (Strong) تنظیم می‌کند. همچنین می‌توانید سطح هم‌ترازی را به محدودشده (Bounded)، نشست (Session) یا در نهایت (Eventually) تنظیم کنید. برای اطلاعات بیشتر در مورد چهار سطح هم‌ترازی در Milvus، به هم‌ترازی مراجعه کنید.

همچنین می‌توانید از فیلدهای پویا در عبارات فیلتر و فیلدهای خروجی در درخواست پرس‌وجو استفاده کنید. برای مثال، به الگوی پویا مراجعه کنید.

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

queryResult, err := milvusClient.Query(
    context.Background(),                                   // ctx
    "book",                                                 // CollectionName
    "",                                                     // PartitionName
    entity.NewColumnInt64("book_id", []int64{2,4,6,8}),     // expr
    []string{"book_id", "book_intro"},                      // OutputFields
    opt,                                                    // queryOptions
)
if err != nil {
    log.Fatal("Failed to query the collection:", err.Error())
}
پارامتر توضیحات گزینه‌ها
ctx زمینه مورد استفاده برای کنترل فرآیند فراخوانی API. N/A
CollectionName نام مجموعه ای که قرار است پرس‌وجو شود. N/A
partitionName اسامی بخش‌هایی که باید بارگذاری شود. اگر خالی باشد، تمام بخش‌ها را پرس‌وجو کنید. N/A
expr عبارت بولیایی‌ای که برای فیلتر کردن ویژگی‌ها استفاده می‌شود. برای اطلاعات بیشتر به قوانین اصطلاحات بولیایی مراجعه کنید.
OutputFields اسامی فیلدهایی که باید بازگردانده شوند. فیلدهای برداری در نسخه فعلی پشتیبانی نمی‌شوند.
opts گزینه‌های پرس‌وجو نمایندگی شده در اشکال entity.SearchQueryOptionFunc. - ‌limit تعداد موجودیت‌های بازگردانده شده را نشان می‌دهد. - ‌offset تعداد موجودیت‌هایی را که در طول فرآیند جستجو صرف‌نظر کنیم را نشان می‌دهد. مجموع این پارامتر و limit باید کمتر از 16384 باشد. - ‌ConsistencyLevel سطح هم‌ترازی مورد استفاده در طول فرآیند جستجو را نمایش می‌دهد. - ‌Ignore Growing نشان می‌دهد که آیا باید بخش رشدی را در طول فرآیند جستجو شباهت رد کنیم یا نه. مقدار پیش فرض false است که نشان می‌دهد جستجو شامل بخش رشدی می‌شود.

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

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

محاسبه تعداد موجودیت‌ها

هنگام اجرای پرس‌وجو، می‌توانید count(*) را به output_fields اضافه کنید تا Milvus بتواند تعداد موجودیت‌ها را در مجموعه بازگرداند. اگر می‌خواهید تعداد موجودیت‌های مطابق با شرایط خاصی را بشمارید، از expr استفاده کنید تا یک عبارت بولیایی تعریف کنید.

محدودیت‌ها

هنگام استفاده از count(*) در output_fields، استفاده از پارامتر limit مجاز نیست.