البحث عن التشابه في الناقل البرمجي

هذا الموضوع يقدم كيفية البحث عن الكيان في Milvus.

البحث عن التشابه الناقلي في Milvus يحسب المسافة بين ناقل الاستعلام والناقل في المجموعة، ويعيد أكثر النتائج تشابهًا. يمكنك أيضًا إجراء بحث مختلط عن طريق تحديد تعبير منطقي لتصفية الحقول العلمية أو حقول المفتاح الأساسي.

المثال التالي يوضح كيفية إجراء بحث عن التشابه الناقلي في مجموعة من 2000 صفًا، مكونة من معرفات الكتب (المفتاح الأساسي)، تكرار الكلمات (حقل علمي)، ووصف الكتب (حقل ناقل). يحاكي هذا السيناريو بحثًا عن الكتب المحددة بناءً على الوصف الناقل. ستعيد Milvus أكثر النتائج تشابهًا بناءً على ناقل الاستعلام المحدد ومعلمات البحث.

تحميل المجموعة

قبل إجراء بحث عن التشابه الناقلي، تقوم Milvus بتنفيذ جميع عمليات البحث والاستعلام في الذاكرة. يرجى تحميل المجموعة في الذاكرة قبل إجراء بحث عن التشابه الناقلي.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("فشل تحميل المجموعة:", err.Error())
}

إعداد معلمات البحث

قم بإعداد معلمات مناسبة لسيناريو البحث الخاص بك. يقوم المثال التالي بتحديد استخدام مسافة اليوركليدي لحساب المسافة واسترجاع الناقلات من أقرب عشرة تجمعات تم بناؤها بواسطة فهرس IVF_FLAT.

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
})
المعلمة الوصف الخيارات
NewIndex*SearchParam func الدالة لإنشاء 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 الخيارات للبحث القريب. - 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("فشل البحث في المجموعة:", err.Error())
}
القيمة الوصف الخيارات
ctx السياق المستخدم للتحكم في عملية استدعاء الواجهة البرمجية غ/م
CollectionName اسم المجموعة المراد تحميلها غ/م
partitionNames قائمة أسماء الأقسام المراد تحميلها. إذا كانت فارغة، يتم البحث في جميع الأقسام غ/م
expr التعبير المنطقي لفرز الخصائص انظر إلى قواعد التعبير المنطقي للحصول على معلومات مفصلة
output_fields أسماء الحقول المراد إرجاعها غ/م
vectors النواقيس المراد البحث عنها غ/م
vectorField اسم الحقل المراد البحث فيه غ/م
metricType نوع المقياس المستخدم للبحث يجب أن يكون هذا المعلم نفس النوع المستخدم لبناء الفهرس
topK عدد النتائج المراد إرجاعها. يجب أن يكون مجموع هذه القيمة و offset في opts أقل من 16384 غ/م
sp entity.SearchParam محددة للفهرس غ/م

تحقق من قيم المفتاح الأساسي والمسافات لأكثر النواقص المماثلة.

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

بعد اكتمال البحث، قم بإطلاق المجموعة المحملة في Milvus لتقليل استهلاك الذاكرة.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("فشل إطلاق المجموعة:", err.Error())
}

القيود

الميزة الحد الأقصى
طول اسم المجموعة 255 حرفًا
عدد الأقسام في مجموعة ما 4,096
عدد الحقول في مجموعة ما 256
عدد الشظايا في مجموعة ما 256
بُعد النواقيس 32,768
أعلى K 16,384
عدد النواقص المستهدفة 16,384

القيام بعملية البحث المختلط

البحث المختلط في الأساس هو بحث نائب مع تصفية السمات. من خلال تحديد تعبير منطقي لتصفية الحقول الطردية أو الحقول الرئيسية، يمكنك تقييد البحث استنادًا إلى شروط محددة.

يوضح المثال التالي كيفية إجراء بحث مختلط باستخدام البحث النائب العادي. فلنفترض أنك ترغب في البحث عن كتب محددة بناءً على مقدمة الكتب المتجهية، ولكنك ترغب فقط في استرداد الكتب ضمن نطاق محدد لعدد الكلمات. يمكنك بعد ذلك تصفية حقل "عدد الكلمات" عن طريق تحديد تعبير منطقي في معاملات البحث. سيقوم 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("فشل البحث في المجموعة:", err.Error())
}

تحقق من النتائج المرجعة.

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