Elasticsearch / الأساسي: عقود المستندات والاستعلامات / الدرس 2
التعيينات الصريحة وعقود الحقول
اختر سلوك الحقول قبل الفهرسة، وامنع التوسع العرضي للمخطط والأنواع غير المتوافقة.
في هذه الصفحة
أهداف الدرس
- ميّز حقول text وkeyword والأرقام والتواريخ.
- اشرح dynamic: strict والحقول متعددة التمثيلات وحدود إعادة الفهرسة.
قد تخدم السلسلة أسئلة مختلفة
يخدم العنوان اكتشاف القطع بالكلمات، بينما يخدم معرّف مجموعة المقتنيات المطابقة الدقيقة. إذا عومل الاثنان كسلاسل نصية بلا تمييز، أصبحت هذه المتطلبات رهينة السلوك الافتراضي. يُحلَّل حقل text إلى مصطلحات بحث، بينما يحتفظ keyword بقيمة دقيقة تناسب التصفية والفرز وكثيراً من التجميعات. ويمكن للحقل متعدد التمثيلات أن يعرض قيمة المصدر بالطريقتين، لكن التمثيل الإضافي يستهلك مساحة وعمل فهرسة إضافيين. حدّد السؤال الذي يخدمه كل حقل في المنتج بدلاً من إضافة حقل keyword فرعي لكل شيء. ويجب أن تبقى أرقام مثل رموز الاقتناء نصوصاً إذا لم يكن لإجراء الحساب عليها معنى.
انشر تعييناً صغيراً مقصوداً
يخص جسم الطلب إنشاء فهرس اصطناعي اسمه museum-artifacts-v1. للعنوان تمثيل نصي كامل وحقل فرعي raw من نوع keyword، بينما year عدد صحيح وacquired_at تاريخ. تمنع التعريفات الصريحة أخطاء تعتمد على أول مستند، مثل تحول معرّف مؤلف من أرقام إلى نوع رقمي، أو اكتشاف نص ملتبس يشبه التاريخ بوصفه تاريخاً. يرفض dynamic: strict الحقول غير المعروفة بدلاً من توسيع العقد بصمت. لكن الصرامة مفيدة فقط إذا اتفق المنتج والمستهلك على آلية لتطوير المخطط؛ وإلا فقد تُرفض بيانات جديدة مشروعة من دون مسار واضح لإصلاحها.
{"mappings":{"dynamic":"strict","properties":{"artifact_id":{"type":"keyword"},"title":{"type":"text","fields":{"raw":{"type":"keyword"}}},"year":{"type":"integer"},"acquired_at":{"type":"date"}}}}
هذا جسم اصطناعي لإنشاء فهرس. يمثل title.raw صورة مفهرسة من قيمة title، وليس خاصية JSON مستقلة يجب أن يرسلها المصدر.
يختلف تجاهل الحقل عن فهرسته
في الفهارس العادية التي تحتفظ بـ_source، قد يسمح dynamic: false ببقاء حقول المصدر غير المعروفة في المستند من دون تعيينها للبحث العادي. يختلف ذلك عن رفض المستند في الوضع strict، ويختلف أيضاً عن إنشاء الحقول الجديدة ديناميكياً. ولهذا قد ترى حقلاً في المستند المعاد، مع أن استعلام exists أو term لا يستطيع استخدامه. لا تعمم قواعد التخزين هذه على أوضاع فهرسة متخصصة أحدث قبل مراجعة وثائقها. وعند اعتماد توسعة مضبوطة، أضف تعييناً مراجعاً، وحدّث عقد المنتج، ثم طابق المستندات القديمة إذا كان تمثيلها المفهرس يحتاج إلى إعادة بناء.
اختبر الحدود لا مستند النجاح فقط
قد يُرفض المستند بسبب عدد صحيح معيب، أو تاريخ غير صالح، أو كائن أُرسل حيث يُتوقع مقدار مفرد. وتحتاج المصفوفات أيضاً إلى عناصر من أنواع متسقة؛ فلا يوجد في الفهرسة العادية نوع مستقل للمصفوفة. لا تضيف NULL والمصفوفة الخالية قيمة مفهرسة عادة، بينما يمكن أن يكون النص الفارغ قيمة keyword مشروعة. اختر قواعد القيم الغائبة عند حدود التطبيق، ووثّق أي استخدام لتعيين null_value. يطابق المصدر التجريبي أدناه الحقول المعلنة، لكن قبول محلل JSON له لا يثبت أن Elasticsearch قَبِله أو فهرسه.
{"artifact_id":"art-101","title":"Bronze compass","year":1890,"acquired_at":"2026-10-01T09:00:00Z"}
هذه بيانات JSON صحيحة لمراجعة أنواع الحقول المقصودة. لا يُدَّعى تنفيذ تحقق من التعيين على محرك Elasticsearch.
يحتاج النوع الجديد عادة فهرساً جديداً
لا يمكن تغيير كثير من أنواع الحقول القائمة في موضعها. وغالباً يلزم إنشاء فهرس جديد بتعيين مصحح، ثم إجراء إعادة فهرسة مضبوطة. كذلك لا تؤدي إضافة حقل فرعي جديد إلى ملء تمثيله بأثر رجعي للمستندات المفهرسة سابقاً؛ بل تحتاج هذه المستندات إلى تحديث أو إعادة فهرسة إذا كان التمثيل مطلوباً. خطط للأسماء البديلة، ومطابقة الأعداد، ومحاسبة العناصر الفاشلة، والتغييرات المتزامنة في المصدر قبل تحويل القراء. ومن مشكلات التصميم أيضاً تضخم التعيين: فقد تولد مفاتيح سمات اعتباطية عدداً غير محدود من تعريفات الحقول. وقد يكون مخطط محدود أو تمثيل flattened مناسب أفضل من رفع حد الحقول من دون فهم المصدر.
الأخطاء الشائعة وإصلاحها
strict_dynamic_mapping_exception
- لماذا يحدث؟
- أرسل المنتج حقلاً لا يوجد في التعيين الصارم الذي خضع للمراجعة.
- كيف تصلحه؟
- راجع تغير المصدر، وأضف توسعة المخطط المقصودة وحدها.
- كيف تتجنب تكراره؟
- نسّق إصدارات المنتج والتعيين، مع محاسبة العناصر المرفوضة.
mapper_parsing_exception
- لماذا يحدث؟
- تتعارض قيمة حقل مع النوع المعلن له أو النوع الذي اكتُشف سابقاً.
- كيف تصلحه؟
- افحص مسار الحقل الدقيق ونوعه في المصدر الأصلي.
- كيف تتجنب تكراره؟
- اختبر حدود الأرقام والكائنات والتواريخ والقيم الغائبة قبل الإدخال.
يبقى الحقل الفرعي الجديد بلا قيم للمستندات القديمة
- لماذا يحدث؟
- لم تُعِد إضافة التعيين بناء التمثيلات المفهرسة السابقة.
- كيف تصلحه؟
- خطط لتحديث أو إعادة فهرسة مصرح بهما، مع مطابقة النتائج.
- كيف تتجنب تكراره؟
- ضمّن البيانات التاريخية في فحوص قبول كل تغيير في التعيين.
اختبر فهمك
1. هل ينبغي جعل artifact_id بالقيمة 000123 عدداً صحيحاً لمجرد أنه يتكون من أرقام؟
اعرض الحل المشروح
لا. إذا كانت الأصفار البادئة والهوية مهمة، فإن keyword يعبر عن دلالة المعرّف الدقيق. سيزيل التعيين الرقمي ذلك التمثيل، ويوحي بإمكان إجراء حسابات لا معنى لها على الهوية. افصل أي تسلسل رقمي حقيقي عن معرّف الأعمال المعروض، واختبر المطابقة الدقيقة بقيم مصدر واقعية.
2. يظهر حقل في _source لكن لا يمكن استخدامه في التصفية. ما إعداد التعيين الذي قد يفسر ذلك؟
اعرض الحل المشروح
في نموذج الفهرسة العادي الذي يخزن المصدر، قد يكون dynamic: false قد تجاهل الحقل غير المعروف عند التعيين مع الاحتفاظ به في المصدر. افحص التعيين الفعلي ووضع الفهرس. وإذا احتاج البحث إلى الحقل، فأضف تمثيلاً مراجعاً وأعد بناء المستندات القديمة؛ ولا تعتبر وجود المفتاح في JSON المعاد دليلاً على وجود حقل مفهرس.
أهم ما تعلمته
- يحدد التعيين سلوك البحث، ولا يكتفي بالتحقق من صياغة JSON.
- يجب أن تحسب تغييرات المخطط أثرها في المستندات المفهرسة القائمة.