دورة حياة الصف
ثلاثة أنواع من الخطوات تغطي دورة الحياة المُفهرَسة بالمعرِّف، جميعها عبرPOST /v1/namespaces/{ns}/query:
UpsertN— استبدال صف كامل مُفهرَس علىidالخارجي. تُحذَف الصفوف الموجودة بذلك المعرِّف، ثم يُدرَج الصف الجديد. استبدال، لا دمج: upsert بلا متجه لصف متجهي يُسقِط المتجه.SetProps— الكتابة فوق مفاتيح محددة على تدفق مطابق (ابدأ الاستعلام بـNWhere)؛ قيمةnullتُزيل المفتاح. لا يمكن تغييرidنفسه — ذلكUpsertN. مناسب لإعادة كتابات السمات العَرضية، غير مناسب لعدّادات لكل استعلام.DeleteN— حذف تدفق مطابق (NWhere→DeleteN)، أو مرِّرidsلحذف مباشر بالمعرِّف الخارجي.
ترميزات المتجه
لكل صف، أحد ترميزَي التوصيل (إرسال كليهما400):
vector_b64 هو base64 للمتجه بوصفه مصفوفة f32 صغيرة الترتيب (little-endian) — أصغر بنحو 4× على السلك ومفكوكة بـ memcpy بدلاً من تحليل أرقام JSON. مُرمِّز بايثون:
400.
الاستيعاب الجماعي: POST /v1/namespaces/{ns}/bulk-vectors
مسار بذر عالي الإنتاجية — إطار ثنائي واحد لكل طلب (Content-Type: application/octet-stream): رأس JSON صغير (dims وlabel وids وprops مشتركة) متبوعاً بقيم fp16 مُطبَّعة L2 بترتيب صفي. مقارنة بـ JSON+base64، يتجنب هذا إعادة ترميز حمولات بعدة غيغابايتات عدة مرات.
التحميل الآمن للاستئناف
تُمرِّر المُحمِّلات القابلة للاستئناف?expected_generation=<G>&expected_rows=<N>. يُقبَل الإطار فقط عندما تكون مساحة الاسم في تلك الحالة بالضبط:
- الإطار نفسه تم الالتزام به بالفعل →
200مع"replayed": trueوrequest_fingerprintالمتطابق — بلا صفوف مكررة. - حمولة مختلفة في نفس الموضع →
409 write_conflict. - الكتابات الشرطية الناجحة تُعيد
request_fingerprintوrows_beforeوrows_after— سجّل نقطة تفتيش دفعتك فقط بعد استلام أحد هذه الإيصالات.
الضغط
الضغط التلقائي هندسي، لذا يظل إجمالي عمل الضغط خطياً في البايتات المستوعبة. أنهِ أي تحميل جماعي بضغط صريح — أرسل"compact": true في المستوى الأعلى من آخر طلب كتابة:
"compacted": true/false. يبني الضغط أيضاً فهرس ANN بمجرد أن يصبح الجدول كبيراً بما فيه الكفاية؛ الصفوف المكتوبة بعد لقطة الفهرس تُدمج بالقوة الغاشمة في النتائج، لذا لا تُضحّى بالحداثة أبداً.
إزالة تكرارات من مصدر جماعي
تُلحق الأطر الجماعية بشكل أعمى بحكم التصميم — مصدر يحمل معرِّفات مكررة يُوصِلها بصمت، والمكررات تحرق فتحات top-k.{"DedupN": {}} يوفّق مخزناً مع عقد فريدية المعرِّف الخارجي (يحتفظ بآخر صف مكتوب لكل معرِّف)، و{"DedupN": {"dry_run": true}} هو تدقيق إحصاء فقط ينبغي أن يشغّله أي تحميل جماعي حين لا يستطيع مصدره إثبات فريدية المعرِّف — عدد صفوف إجمالي متطابق لا يمكنه كشف المكررات المختبئة داخله.
قواعد إعادة المحاولة
يمكن دائماً إعادة محاولة القراءات بعد فشل نقل. بالنسبة للكتابات، فقط الأطر الجماعية الشرطية قابلة تلقائياً لإعادة المحاولة (إطار متطابق + معاملات CAS → الإيصال الأصلي أوreplayed: true). لا تُعِد أبداً تشغيل كتابة غير مشروطة بشكل أعمى بعد استجابة ضائعة — وفِّق الحالة أولاً.