Elasticsearch / المتوسط: النماذج وخطوط معالجة البيانات وأدلة الملاءمة / الدرس 8
الكائنات والسجلات المتداخلة وإزالة التطبيع
احفظ العلاقات داخل مصفوفات المستندات، واختر نموذج بحث تفهم تكاليف تحديثه.
في هذه الصفحة
أهداف الدرس
- اشرح التطابقات بين عناصر مختلفة في مصفوفات object العادية.
- استخدم نطاق nested، ووازن إزالة التطبيع مع نموذج الربط.
تحوي المصفوفة أزواجاً لا قوائم مستقلة
قد تكون للقطعة تكليفات حفظ: القيّم A مراجع، والقيّم B مرمم. وتسأل الأعمال هل رمم القيّم A هذه القطعة. إذا سُطحت مصفوفة object العادية إلى حقلَي curator وrole متعددي القيم، فقد يطابق الشرطان A من كائن وrestorer من كائن آخر. ويظل JSON المصدر يبدو محتفظاً بالأزواج، ما يسهل إغفال العيب عند الفحص اليدوي. حدد هل يجب تحقق الشروط في عنصر المصفوفة نفسه. فاقتران الصفوف المتوقع في قاعدة بيانات علائقية لا يبقى تلقائياً عند استخدام تعيين الكائن العادي في فهرس المستندات.
احتفظ بمثال تطابق متقاطع متعمد
لا يتضمن المستند الاصطناعي عمداً تكليفاً واحداً يجمع curator-a والدور restorer. لذلك يجب أن يرفضه الاستعلام الصحيح الذي يشترط التكليف نفسه، مع قبوله لسؤال curator-b بوصفه restorer. هذا المثال السلبي أوضح من تكليفين تتوافق قيمهما مصادفة مع كل تركيب محتمل. احتفظ بهوية المصدر وقيم الأدوار المضبوطة الدقيقة. ولا تسمح للتطبيع أو التحليل بإضافة التباس آخر إلى هذه العلاقة؛ إذ تجعل keyword عقد المساواة صريحاً. المعروض بيانات مصدر فقط، ولا يثبت نوع التعيين الذي سيُستخدم لها.
{"artifact_id":"art-101","assignments":[{"curator":"curator-a","role":"reviewer"},{"curator":"curator-b","role":"restorer"}]}
لا يجمع أي تكليف واحد curator-a وrestorer. وقد يفقد تعيين object العادي هذه العلاقة بين القيمتين.
ادخل نطاق nested واحداً للشرطين
عيّن assignments من نوع nested عندما يجب أن يبقى كل كائن قابلاً للبحث باستقلال، واجعل curator وrole حقلين فرعيين من نوع keyword. يضع nested query الشرطين داخل نطاق nested واحد. أما استعلاما nested المنفصلان فقد يطابق كل منهما كائناً ابناً مختلفاً، فلا يكفي تشابه الشكل بينهما. تستطيع inner_hits إظهار السجلات المتداخلة التي طابقت، لكن إرجاع عدد كبير منها يزيد العمل اللازم للاستجابة. وتمثل كائنات nested بمستندات داخلية إضافية، مع تكاليف فهرسة وبحث. إنها أداة دلالية لمتطلبات الاقتران الحقيقية، لا تمثيل افتراضي لكل مفتاح بيانات تعريف اعتباطي.
{"query":{"nested":{"path":"assignments","query":{"bool":{"filter":[{"term":{"assignments.curator":"curator-a"}},{"term":{"assignments.role":"restorer"}}]}},"score_mode":"none"}}}
بافتراض تعيين nested المذكور، لا يطابق الاستعلام المستند التجريبي، لأنه لا يوجد سجل nested واحد يحقق الشرطين معاً.
تستبدل إزالة التطبيع سهولة القراءة بكلفة الانتشار
يجنب تضمين اسم القسم في كل مستند قطعة إجراء ربط أثناء البحث، لكن تغيير اسم القسم يستلزم تحديث كل مستند بحث متأثر. احفظ هوية القسم المعتمدة مع الاسم المنسوخ، وحدد تأخر انتشار التحديث المقبول. وحتى التحديث الجزئي لمستند أب واحد قد يستلزم إعادة فهرسة تمثيله في Lucene؛ فلا تستنتج تكلفة تحديث صف علائقي من صغر تصحيح JSON. وتوفر علاقات الأب والابن نموذجاً آخر بقيود في التوجيه والأداء، وتوصي Elastic باستخدامه بعناية، لا معاملته كمحرك ربط علائقي. اختر النموذج وفق تكرار الاستعلامات والتحديثات واحتياجات الاتساق.
لأعداد nested وحدة مختلفة
يعد التجميع nested السجلات المتداخلة داخل نطاقه، ولا يعد تلقائياً القطع الجذرية المميزة. ويمكن لـreverse_nested العودة إلى سياق الأب لإجراء ملخصات مناسبة. فإذا كانت للقطعة ثلاثة تكليفات مطابقة، فقد تعرض اللوحة ثلاثة تكليفات ولكن قطعة واحدة فقط. سمِّ هذين المقياسين وطابقهما على بيانات صغيرة. وقد تلائم flattened بيانات المفاتيح والقيم الاعتباطية عندما لا يلزم البحث الغني داخل الكائن نفسه، فتتجنب عدداً غير محدود من سجلات nested. ويحتاج كل اختيار إلى حدود لحجم المصدر وطول المصفوفة واتساع الاستعلام الذي يتحكم فيه المستخدم. راجع الصحة الدلالية وسلامة الموارد معاً.
الأخطاء الشائعة وإصلاحها
يبدو أن القيّم أدى دوراً غير مسند إليه
- لماذا يحدث؟
- طابقت الشروط قيماً من عناصر مختلفة داخل مصفوفة object عادية.
- كيف تصلحه؟
- استخدم نموذج nested خضع للمراجعة، وضع شروط السجل نفسه داخل نطاق واحد.
- كيف تتجنب تكراره؟
- احتفظ بمثال سلبي للتطابق بين عناصر مختلفة ضمن تحقق النموذج.
لا يزال شرطان nested يطابقان سجلين مختلفين
- لماذا يحدث؟
- اختار كل شرط على حدة كائناً ابناً مختلفاً.
- كيف تصلحه؟
- اجمع الشروط داخل استعلام nested واحد إذا وجب أن يحققها ابن واحد.
- كيف تتجنب تكراره؟
- راجع حدود النطاق صراحة، لا أسماء الحقول وحدها.
تعد لوحة العرض القطع أكثر من مرة
- لماذا يحدث؟
- وُصفت أعداد سجلات nested بأنها أعداد مستندات جذرية.
- كيف تصلحه؟
- عد إلى نطاق الأب عند الحاجة، وسمِّ وحدتَي العد.
- كيف تتجنب تكراره؟
- اختبر أباً واحداً له عدة أبناء مطابقين.
اختبر فهمك
1. هل يجب أن يطابق curator-a مع restorer المستند التجريبي؟
اعرض الحل المشروح
لا، إذا كان المطلوب تحقق الشرطين في التكليف نفسه. دور curator-a هو reviewer، ودور curator-b هو restorer. عيّن assignments كـnested، واجمع الشرطين داخل نطاق nested واحد. قد يعيد object العادي تطابقاً كاذباً بين عنصرين مختلفين، رغم أن _source يبدو محتفظاً باقتران القيم.
2. ماذا يجب أن يوضح تصميم اسم القسم المنسوخ عن عملية إعادة التسمية؟
اعرض الحل المشروح
يجب أن يحدد الهوية المعتمدة للقسم، وكيف تُكتشف المستندات المتأثرة، وكيف ينتشر التحديث، ومقدار التأخر المقبول. احتفظ بأدلة المطابقة حتى يمكن إصلاح الأسماء القديمة. لا تعد باتساق فوري عبر مستندات كثيرة لمجرد تغيير اسم واحد في النظام المصدر.
أهم ما تعلمته
- يتطلب الحفاظ على اقتران عناصر مصفوفة الكائنات نموذج بحث صريحاً.
- تشمل نمذجة المستندات انتشار التحديثات ووحدات العد.