Search & Filtersالبحث والفلاتر.
إزاي العميل بيلاقي المنتج. محرّك البحث وفهرسه، الخصائص القابلة للبحث وأوزانها، الـ layered navigation، والتخصيص والتشخيص.
البحث في Magento 2 بيتم في محرّك خارجي، OpenSearch أو Elasticsearch، بيستقبل نسخة من بيانات المنتجات من فهرس catalogsearch_fulltext. النتايج بتترتّب بالصلة حسب Search Weight لكل خاصية، والفلاتر الجانبية بتتحسب من نفس الاستعلام بالـ aggregations. الفلترة بتشتغل مع خصائص Dropdown أو Multiselect بس، وأول حاجة تشيّك عليها لما حاجة ماتظهرش هي الفهرسة.
الصورة الكاملة
من كتابة الكلمة لعرض النتايج.
الـ فلاتر والبحث بيشتغلوا من نفس الفهرس. لما تفلتر، Magento بيعيد الاستعلام بشرط إضافي — فالفلاتر مش طبقة منفصلة، هي جزء من نفس الاستعلام.
محرّك البحث
خدمة منفصلة لازم تكون شغّالة.
الاتنين محرّكات بحث مبنية على نفس الأساس. OpenSearch نسخة مفتوحة انفصلت عن Elasticsearch، والنسخ الحديثة من Magento بتدعم الاتنين.
من Stores → Configuration → Catalog → Catalog → Catalog Search: نوع المحرّك، العنوان، المنفذ، وبادئة الفهرس.
# هل الخدمة شغّالة؟ curl http://localhost:9200 # الفهارس الموجودة curl http://localhost:9200/_cat/indices?v # صحة الخدمة curl http://localhost:9200/_cluster/health?pretty
الإعداد Index Prefix بيحدد اسم الفهرس. لو أكتر من مشروع بيستخدموا نفس سيرفر البحث، لازم كل واحد ببادئة مختلفة.
فهرس البحث
إزاي بيتبني وامتى بيتحدّث.
catalogsearch_fulltext — بيجمّع بيانات المنتجات ويبعتها لمحرّك البحث.
- الخصائص المعلّم عليها searchable.
- الخصائص المعلّم عليها filterable (عشان الفلاتر).
- بيانات التوفّر والسعر والأقسام.
- خصائص الأبناء في المنتجات المركّبة.
# حالة فهرس البحث bin/magento indexer:status catalogsearch_fulltext # إعادة بناء bin/magento indexer:reindex catalogsearch_fulltext # الوضع — Schedule أفضل في production bin/magento indexer:show-mode catalogsearch_fulltext bin/magento indexer:set-mode schedule catalogsearch_fulltext
خصائص البحث والأوزان
إزاي تتحكم في ترتيب النتايج.
من Stores → Attributes → Product، اختار الخاصية، ومن Storefront Properties حدّد Use in Search.
رقم من 1 لـ 10 بيحدد أهمية الخاصية في ترتيب النتايج. الأعلى بيرفع المنتج في النتايج لما الكلمة تتطابق مع الخاصية دي.
لو خليت الوصف الكامل بوزن 10، البحث عن "قطن" هيرجّع أي منتج ذكر كلمة قطن في وصفه — حتى لو بيقول "مش مصنوع من قطن". الأوزان المتوازنة بتمنع ده.
المرادفات والتحسينات
أدوات جاهزة بتحسّن النتايج من غير كود.
العربي فيه تحديات: الهمزات (أحمد/احمد)، التاء المربوطة (شنطة/شنطه)، والتشكيل. العملاء بيكتبوا بطرق مختلفة، والمحرّك بيتعامل معاها كلمات مختلفة.
Layered Navigation
الفلاتر الجانبية — إزاي بتشتغل.
الفلاتر اللي بتظهر جنب نتايج القسم أو البحث، وكل خيار جنبه عدد المنتجات.
ده الجزء الذكي. لما تختار "أزرق"، الأعداد في باقي الفلاتر بتتحدّث عشان تعكس المنتجات الزرقا بس. المقاس M بقى (3) مش (30).
بيمنع النتايج الفاضية. العميل مابيقدرش يختار تركيبة مالهاش منتجات، لأن الخيار ده هيبقى (0) أو مش ظاهر أصلاً.
أنواع الفلاتر
كل نوع وسلوكه.
إعداد خاصية للفلترة
خطوة بخطوة، والشروط اللي لازم تتحقق.
- نوع الخاصية select أو multiselect — مش text.
- Use in Layered Navigation = Filterable.
- المنتجات ليها قيم فعلاً في الخاصية دي.
- إعادة فهرسة ومسح كاش.
$eavSetup->addAttribute( Product::ENTITY, 'fabric', [ // لازم int + select عشان الفلترة تشتغل 'type' => 'int', 'input' => 'select', 'label' => 'Fabric', 'source' => Table::class, // 1 = with results, 2 = no results 'filterable' => 1, 'filterable_in_search' => true, // البحث النصي — اختياري 'searchable' => true, 'search_weight' => 3, // لازم global للفلترة الصحيحة 'global' => ScopedAttributeInterface::SCOPE_GLOBAL, 'option' => [ 'values' => ['Cotton', 'Silk', 'Wool'], ], 'group' => 'General', ] );
bin/magento setup:upgrade bin/magento indexer:reindex catalogsearch_fulltext bin/magento cache:clean
البحث في الكود
تنفيذ بحث برمجياً.
use Magento\Search\Api\SearchInterface; use Magento\Framework\Api\Search\SearchCriteriaBuilder; use Magento\Framework\Api\FilterBuilder; class ProductSearch { public function __construct( private readonly SearchInterface $search, private readonly SearchCriteriaBuilder $criteriaBuilder, private readonly FilterBuilder $filterBuilder ) {} public function find(string $term): array { // الفلتر الخاص بالبحث النصي $filter = $this->filterBuilder ->setField('search_term') ->setValue($term) ->create(); $criteria = $this->criteriaBuilder ->addFilters([$filter]) ->setPageSize(20) ->create(); // لازم نحدد الطلب — quick_search_container $criteria->setRequestName('quick_search_container'); $result = $this->search->search($criteria); $ids = []; foreach ($result->getItems() as $item) { $ids[] = (int) $item->getId(); } return $ids; } }
- search_term — الحقل الخاص بالبحث النصي، مش خاصية عادية.
- setRequestName — بيحدد إعدادات البحث المستخدمة. quick_search_container للبحث السريع.
- بيرجّع IDs بس — لازم تحمّل المنتجات بعدها من الـ repository.
بحث نصي
استخدم SearchInterface — بيمرّ بمحرّك البحث والصلة.
فلترة بسيطة
استخدم ProductRepository — أبسط وأسرع لو مفيش بحث نصي.
الأداء والتشخيص
لما البحث يبطّئ أو النتايج تطلع غلط.
# حجم فهارس البحث curl 'localhost:9200/_cat/indices?v&s=store.size:desc' # هل المنتج موجود في الفهرس؟ curl 'localhost:9200/magento2_product_1/_search?q=sku:SKU-001&pretty' # حالة الفهرس في Magento bin/magento indexer:status catalogsearch_fulltext
- المنتج مفعّل ومتاح؟ — status و visibility.
- مربوط بالـ website؟ — منتج مش مربوط مابيظهرش.
- متوفّر؟ — حسب إعداد عرض المنتهي.
- الفهرس متحدّث؟ — indexer:status.
- موجود في محرّك البحث فعلاً؟ — الاستعلام فوق.
- الكاش اتمسح؟
الفخاخ الشائعة
اقرا دي حتى لو مش هتقرا حاجة تانية.
- خاصية text وتوقّع إنها تتفلتر — لازم select. الفخ الأول.
- نسيان إعادة الفهرسة — السبب الأول لـ "مش ظاهر في البحث".
- الفلتر مش ظاهر لأن مفيش منتجات ليها قيم — شرط بيتنسي.
- نفس بادئة الفهرس لبيئتين — منتجات staging تظهر في production.
- وزن عالي للوصف الكامل — نتايج غير دقيقة.
- كل الخصائص searchable — فهرس ضخم وبناء بطيء.
- 15 فلتر في صفحة — بطء وإرباك للعميل.
- وضع الفهرسة على Save في production — كل حفظ منتج بيعيد الفهرسة.
- إهمال تقرير مصطلحات البحث — فرص مبيعات ضايعة كل يوم.
- نسيان setRequestName — استثناء أو نتايج غلط.
أسئلة الإنترفيو
الأسئلة المتكررة.
Search & Filters ✓
دلوقتي فاهم إزاي البحث بيشتغل من الفهرس لمحرّك البحث للصلة، وإزاي الفلاتر بتتحسب، وإزاي تعدّ خاصية للفلترة وتشخّص المشاكل.
الخلاصة: الفلاتر محتاجة خصائص select مش text، والفهرسة هي أول مكان تشوفه لما حاجة ماتظهرش، وتقرير مصطلحات البحث بيقولك إيه اللي العملاء مش لاقينه.
خلّصت الدرس؟علّمه عشان تتابع تقدّمك في الكورس.
أسئلة شائعة
إزاي البحث بيشتغل في Magento 2؟
فهرس catalogsearch_fulltext بيجمّع بيانات المنتجات القابلة للبحث والفلترة مع السعر والتوفّر والأقسام وخصائص الأبناء، وبيبعتها لمحرّك بحث خارجي هو OpenSearch أو Elasticsearch. البحث والفلاتر بيتنفّذوا في المحرّك مش في MySQL، والنتايج بتترتّب بالصلة حسب أوزان الخصائص. من 2.4 المحرّك شرط إجباري لصفحات الكتالوج.
ليه الخاصية مش ظاهرة في فلاتر Layered Navigation؟
بالترتيب: نوعها لازم يكون Dropdown أو Multiple Select مش Text، و Use in Layered Navigation لازم يكون Filterable، ولازم يكون فيه منتجات في القسم ليها قيم فعلًا في الخاصية دي، وبعد كده إعادة فهرسة catalogsearch_fulltext ومسح الكاش. الشرط التالت بيتنسي كتير، لأن الفلتر مابيظهرش لو ولا منتج ليه قيمة.
إزاي أعمل خاصية قابلة للفلترة بالكود في Magento 2؟
في Data Patch نادي EavSetup::addAttribute بـ type int و input select و source Table، و'filterable' => 1 للفلترة مع النتايج أو 2 لعرض الخيارات اللي نتايجها صفر، وfilterable_in_search لو عايزها في فلاتر نتايج البحث، والـ scope Global. بعدها setup:upgrade وإعادة فهرسة البحث ومسح الكاش.
يعني إيه Search Weight في Magento 2؟
رقم من 1 لـ 10 على كل خاصية قابلة للبحث بيحدد أهميتها في ترتيب النتايج. الاسم ياخد وزن عالي والـ SKU وزن عالي والوصف المختصر متوسط والوصف الكامل وزن منخفض، لأن الكلمة في الوصف ممكن تكون عابرة ومش دالة على الصلة. كل خاصية searchable بتكبّر الفهرس، فماتعلّمش إلا على اللي العميل هيكتبه فعلًا.
منتج مش ظاهر في نتايج البحث في Magento 2، أشخّص إزاي؟
اتأكد إن المنتج Enabled والـ visibility بتاعه بتسمح بالبحث ومربوط بالـ website، وإن التوفّر مناسب لإعداد عرض المنتجات المنتهية. بعدها indexer:status ولو الفهرس على Schedule تأكد إن الـ cron شغّال. وأخيرًا استعلم المحرّك مباشرة على الـ SKU في فهرس magento2_product_1، فلو موجود المشكلة في الكاش أو العرض، ولو مش موجود المشكلة في الفهرسة.
إزاي أعمل بحث نصي برمجيًا في Magento 2؟
احقن Magento\Search\Api\SearchInterface وابني SearchCriteria بفلتر على الحقل الخاص search_term، وحدّد setRequestName('quick_search_container') عشان يستخدم إعدادات البحث السريع من search_request.xml. الميثود بترجّع IDs بس، فحمّل المنتجات بعدها من الـ repository. لو بتفلتر بقيم ثابتة من غير كلمة بحث، ProductRepository أبسط.
إزاي أحسّن نتايج البحث باللغة العربية في Magento؟
راجع تقرير Search Terms شهريًا، لأن الكلمات اللي نتايجها صفر إما منتج ناقص أو مرادف محتاج يتضاف. العربي فيه الهمزات والتاء المربوطة والتشكيل، فنفس الكلمة بتتكتب بكذا طريقة والمحرّك بيعتبرها كلمات مختلفة. ضيفها كـ Search Synonyms، ولو المشكلة كبيرة فيه إعدادات تحليل نصوص في المحرّك نفسه بس محتاجة خبرة في إعداده.