بحث الأوجه. العثور على المسار الصحيح: كيف يؤثر التنقل متعدد الأوجه على تحسين محركات البحث (ترجمة)

بيت / ويندوز 7

في هذه المقالة (مستوى مشرف الموقع - متقدم) سنتحدث عن ما يسمى بالتقاطع بطرق مختلفة. الملاحة "الأوجه". لتبسيط عملية استيعاب المادة، أوصي بالاطلاع على مقالة ويكيبيديا "تصنيف الوجه" والمنشورات الموجودة على إنجليزي(ولكن مع الصور!) "صمم تنقلًا أفضل لمواقع الويب الخاصة بك."

يمكن أن يكون التنقل متعدد الأوجه الذي يتم تصفيته حسب اللون أو النطاق السعري مفيدًا للزائرين، ولكنه غالبًا ما يضر بنتائج البحث لأنه ينشئ مجموعات متعددة من عناوين URL ذات محتوى مكرر. نظرًا للتكرارات، لن تتمكن محركات البحث من فحص الموقع بسرعة بحثًا عن تحديثات المحتوى، مما يؤثر بالتالي على الفهرسة. لتقليل هذه المشكلة ومساعدة مشرفي المواقع على جعل التنقل متعدد الأوجه سهلاً للبحث، نود:

مثالية للمستخدمين و بحث جوجل

مسح المسار إلى صفحات المنتجات/المقالات:

تمثيل URL لصفحة الفئة:
http://www.example.com/category.php?category=gummy-candies

تمثيل عنوان URL الخاص بالمنتج:
http://www.example.com/product.php?item=swedish-fish

التكرارات غير المرغوب فيها الناجمة عن التنقل الأوجه

يمكن الوصول إلى نفس الصفحة من عناوين ويب مختلفة:

الصفحة الكنسي



عنوان URL: example.com/product.php؟ البند = الأسماك السويدية

صفحة مكررة



عنوان URL:example.com/product.php؟ item=swedish-fish&category=gummy-candies&price=5-10


الفئة=حلوى غائرة&طعم=حامض&السعر=5-10

الأخطاء:

  • لا فائدة بالنسبة لـ Google نظرًا لأن المستخدمين نادرًا ما يبحثون عن [مربى البرتقال بسعر 9:55 دولارًا أمريكيًا].
  • لا طائل منه ل روبوتات البحث، والتي ستجد نفس العنصر ("سلطة الفاكهة") من صفحات الفئات الرئيسية (إما "Jummy" أو "Sour Gummy").
  • نقطة سلبية بالنسبة لصاحب الموقع، لأن طلبات الفهرسة يتم تخفيفها بإصدارات عديدة من نفس الفئة.
  • نقطة سلبية بالنسبة لصاحب الموقع، لأنها غير مجدية وتحميل إضافي على النطاق الترددي للموقع
صفحات فارغة:


عنوان URL: example.com/category.php؟ الفئة=حلوى صمغية&طعم=حامض&السعر=أكثر من 10

الأخطاء:

  • الكود ل محركات البحث(في هذه الحالة، يجب أن تعرض الصفحة رمز 404)
  • صفحة فارغة للمستخدمين


أسوأ الحلول (غير مناسبة للبحث) للتنقل متعدد الأوجه

المثال رقم 1: لا يُستخدم كجزء من عنوان URL المعلمات القياسية: الفواصل والأقواس، بدلا من ذلك المفتاح=القيمة&:

  • example.com/category? [ فئة:حلوى غائرة ] [ فرز:السعر من الأقل إلى الأعلى ] [ sid:789 ]
  • example.com/category?category، حلوى صمغية، فرز، منخفض إلى مرتفع، sid، 789
كيفية:
example.com/category? الفئة=حلوى غائر&sort=منخفض إلى مرتفع&sid=789

المثال رقم 2: استخدام الدلائل أو مسارات الملفات بدلاً من المعلمات في قوائم القيم التي لا تغير محتوى الصفحة:
example.com/c123 /s789/ المنتج?السمك السويدي
(حيث /c123/ الفئة، /s789/ معرف الجلسة، الذي لا يغير محتوى الصفحة)

حل جيد:

  • example.com /gummy-candy/ المنتج?item=swedish-fish&sid=789(الدليل، /gummy-candy/، يغير محتويات الصفحة بطريقة ذات معنى)
الحل الأفضل:
  • example.com/product?item=swedish-fish& الفئة=حلوى غائر&sid=789 (توفر معلمات URL مرونة أكبر لمحركات البحث لتحديد كيفية الزحف بشكل فعال)
يصعب على برامج الزحف التمييز بين القيم المفيدة (مثل "gummy-candy") والقيم غير المفيدة (مثل "SESSIONID") عندما يتم وضع هذه القيم مباشرة في مسارات الارتباط. ومن ناحية أخرى، توفر معلمات URL المرونة لمحركات البحث للاختبار السريع وتحديد متى لا تتطلب قيمة معينة وصول الزاحف إلى جميع الخيارات.

تتضمن القيم الشائعة التي لا تغير محتوى الصفحة ويجب إدراجها كمعلمات URL ما يلي:

  • معرف الجلسة
  • تتبع الهوية
  • معرفات المرجع
  • الطوابع الزمنية
المثال رقم 3: تحويل القيم التي أنشأها المستخدم (ربما لا نهائية) إلى معلمات URL قابلة للزحف والفهرسة، ولكنها غير مجدية للبحث.
استخدام البيانات الثانوية التي أنشأها مستخدمو الموقع (مثل خط الطول/خط العرض أو "قبل أيام") في العناوين التي تم الزحف إليها وفهرستها:
  • example.com/find-a-doctor? نصف القطر=15&خط العرض=40.7565068&خط الطول=-73.9668408
  • example.com/article?category=health&أيام-منذ=7
كيفية:
  • example.com/find-a-doctor? city=san-francisco&neighborhood=soma
  • example.com/articles?category=health& التاريخ=10-يناير-2014
بدلاً من السماح للمستخدم بإنشاء قيم لإنشاء عناوين URL قابلة للزحف (مما ينتج عنه احتمالات لا نهاية لها ذات قيمة قليلة جدًا للزائرين)، فمن الأفضل نشر فئة صفحة للقيم الأكثر شيوعًا، بالإضافة إلى أنه يمكنك تضمينها معلومات إضافيةبحيث توفر الصفحة قيمة أكبر من صفحة نتائج البحث العادية. وبدلاً من ذلك، قد تفكر في وضع القيم التي أنشأها المستخدم في دليل منفصل، ثم استخدام ملف robots.txt لمنع الزحف من هذا الدليل.
  • example.com /تصفية/ Find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com /تصفية/المقالات?category=health&days-ago=7
وفي ملف robots.txt:
وكيل المستخدم: *
عدم السماح: /تصفية/

المثال رقم 4. إضافة معلمات URL بدون منطق.

  • example.com /حلوى-جيلي/مصاصات/حلوى-جيلي/حلوى صمغية/منتج؟ سمكة سويدية
  • example.com/product? cat=gummy-candy&cat=lollipops&cat=gummy-candy&cat=gummy-candy&item=swedish-fish
حل جيد:
  • example.com /gummy-candy/ المنتج?item=swedish-fish
الحل الأفضل:
  • example.com/product? item=swedish-fish&category=gummy-candy
تؤدي معلمات URL الدخيلة إلى زيادة التكرار، مما يؤدي إلى تقليل كفاءة الزحف إلى الموقع وفهرسته. لذلك، من الضروري التخلص من معلمات URL غير الضرورية وتنظيف الروابط غير المرغوب فيها بشكل دوري قبل إنشاء عناوين URL جديدة. إذا كانت هناك حاجة إلى العديد من المعلمات لجلسة مستخدم، فيمكنك إخفاء المعلومات في ملفات تعريف الارتباط بدلاً من إضافة قيم باستمرار مثل cat=حلوى غائر&cat=مصاصات&cat=حلوى غائر& ...

المثال رقم 5: اقتراح المزيد من التحسينات (التصفية) عندما تكون هناك نتائج فارغة.

بشكل سيء:
السماح للمستخدمين بتحديد عوامل التصفية عندما تكون هناك عناصر فارغة لتحسينها.


توضيح لصفحة نتائجها صفر (مثلا السعر=أكثر من 10) مما يحبط المستخدمين ويسبب طلبات غير ضرورية لمحركات البحث.

كيفية:
قم بإنشاء الروابط فقط عندما تكون هناك عناصر يمكن للمستخدم تحديدها. إذا كانت النتيجة صفر، فسيتم وضع علامة على الرابط باللون "الرمادي" (أي غير قابل للنقر عليه). لمزيد من تحسين سهولة الاستخدام، فكر في تضمين مؤشر لعدد العناصر المتاحة بجوار كل مرشح.


لا يُسمح بعرض صفحة بدون نتائج (على سبيل المثال، السعر=أكثر من 10)، بالإضافة إلى أنه يمنع المستخدمين من إجراء نقرات غير ضرورية، ولا تقوم محركات البحث بالزحف إلى هذا صفحة مفيدة.

من الضروري منع ظهور العناوين غير الضرورية وتقليل المساحة المخصصة للزائر عن طريق إنشاء عناوين URL فقط عند توفر المنتجات. سيساعد هذا في الحفاظ على تفاعل المستخدمين مع موقعك (نقرات أقل على زر الرجوع في حالة عدم العثور على أي منتجات) وسيقلل من عدد عناوين URL المحتملة المعروفة لمحركات البحث. بالإضافة إلى ذلك، إذا لم تكن الصفحة "نفدت مؤقتًا من المخزون" فحسب، ولكن من غير المحتمل أن تحتوي على معلومات ذات صلة على الإطلاق، فقد ترغب في التفكير في منحها رمز استجابة 404. في صفحة 404 يمكنك إنشاء رسالة مفيدةللمستخدمين الذين لديهم المزيد من الخيارات في مربع التنقل أو البحث حتى يتمكن المستخدمون من العثور على المنتجات ذات الصلة.

بالنسبة للمواقع الجديدة التي يفكر مشرفوها في تنفيذ التنقل متعدد الأوجه، هناك عدة خيارات لتحسين الزحف (مجموعة العناوين الموجودة على موقعك المعروفة لـ Google) لصفحات المحتوى الفريدة وتقليل الصفحات المكررة من الدخول إلى فهرس محرك البحث (توحيد الفهرسة إشارات).

حدد معلمات URL المطلوبة لمحركات البحث للزحف إلى كل صفحة محتوى فردية (أي تحديد المعلمات المطلوبة لإنشاء مسار نقرة واحد على الأقل لكل عنصر). قد تتضمن المعلمات المطلوبة معرف العنصر ومعرف الفئة والصفحة وما إلى ذلك.

حدد المعلمات التي ستكون مفيدة للزائرين من خلال استعلاماتهم، والتي من المحتمل أن تسبب تكرارًا في الزحف والفهرسة. في مثال الحلويات (مربى البرتقال)، يمكن أن تكون معلمة عنوان URL "الذوق" ذات قيمة للمستخدمين الذين لديهم طلبات بحث في المثال طعم = حامض . ومع ذلك، فمن المنطقي اعتبار أن معلمة "السعر" تسبب تكرارًا غير ضروري الفئة=الحلوى الصمغية&طعم=حامض& السعر=أكثر من 10 . أمثلة شائعة أخرى:

  • المعلمات القيمة لمحركات البحث: معرف العنصر، معرف الفئة، الاسم، العلامة التجارية ...
  • المعلمات غير الضرورية: معرف الجلسة، النطاق السعري ...
دعونا نلقي نظرة على تنفيذ أحد خيارات التكوين المتعددة لعناوين URL التي تحتوي على معلمات غير ضرورية. فقط تأكد من أن معلمات URL "غير الضرورية" ليست مطلوبة فعليًا لبرامج زحف محركات البحث للزحف أو لكي يتمكن المستخدم من العثور على كل منتج على حدة!

الخيار 1: والروابط الداخلية

قم بتمييز جميع عناوين URL غير الضرورية بالملحق . سيؤدي هذا إلى تقليل تكاليف العمالة لروبوت البحث ومنع انخفاض معدل الزحف. أنت بحاجة إلى إدارة المسح عالميًا من خلال ملف robots.txt (ملاحظة المترجم: راجع المقالة " ").
استخدم السمة rel="canonical" لفصل الصفحات الخاصة بفهرس البحث عن الصفحات غير المطلوبة هناك (على سبيل المثال، في الصفحة السعر=5-10 يمكنك إضافة السمة rel = "canonical" للإشارة إلى فئة جميع مربى البرتقال الحامضة example.com/category.php?category=gummy-candies&taste=sour& page=all ).

الخيار 2: ملف Robots.txt وعدم السماح

يتم تضمين عناوين URL ذات المعلمات غير الضرورية في الدليل /filtering/، والذي سيتم إغلاقه في ملف robots.txt (عدم السماح). سيسمح هذا لجميع محركات البحث بالزحف إلى الرابط (المحتوى) "الصحيح" فقط للموقع، ولكنه سيمنع الزحف إلى عناوين URL غير المرغوب فيها مرة واحدة. على سبيل المثال ( example.com/category.php?category=gummy-candies)، إذا كانت المعلمات القيمة هي العنصر والفئة والذوق، وكان معرف الجلسة والسعر غير ضروريين، فسيكون عنوان URL للذوق كما يلي:
example.com/category.php?category=gummy-candies& طعم = حامض, ولكن سيتم تضمين جميع المعلمات غير الضرورية، مثل السعر، في عنوان URL في دليل محدد مسبقًا - /filtering/:
example.com /تصفية/الفئة.php?category=gummy-candies&price=5-10,
والذي سيتم بعد ذلك حظره عبر ملف robots.txt:
وكيل المستخدم: *
عدم السماح: / التصفية /

الخيار 3: مضيفين منفصلين

تأكد أفضل الحلول، المذكورة أعلاه (على سبيل المثال، للعناوين غير الضرورية) لا تزال سارية. في خلاف ذلكلقد شكلت محركات البحث بالفعل كتلة ارتباط كبيرة في الفهرس. وبالتالي، سيهدف عملك إلى تقليل النمو الإضافي للصفحات غير الضرورية التي يتم الزحف إليها بواسطة Googlebot ودمج إشارات الفهرسة.

استخدم المعلمات ذات التشفير القياسي وتنسيق المفتاح=القيمة.

تأكد من أن القيم التي لا تغير محتوى الصفحة، مثل معرفات الجلسة، يتم تنفيذها كمفتاح = قيمة بدلاً من الأدلة.

لا تسمح بالنقرات أو إنشاء عناوين URL في حالة عدم وجود عناصر لتصفيتها.

إضافة منطق إلى تعيين معلمات URL: قم بإزالة المعلمات غير الضرورية بدلاً من إضافة القيم باستمرار (على سبيل المثال، تجنب إنشاء الارتباط مثل هذا: example.com/product?cat=gummy-candy&cat=lollipops &cat=gummy-candy&item=swedish-fish).

قم بتخزين المعلمات القيمة في عناوين URL عن طريق إدراجها أولاً (نظرًا لأن عناوين URL تكون مرئية في نتائج البحث) ثم المعلمات الأقل صلة في النهاية (على سبيل المثال، معرف الجلسة).
تجنب بنية الارتباط هذه: example.com/category.php? معرف الجلسة=123&tracking-id=456&category=gummy-candies&taste=sour
قم بتكوين معلمات URL في أدوات مشرفي المواقع إذا كان لديك فهم واضح لكيفية عمل الروابط على موقعك.

تأكد من أنه عند استخدام JavaScript لمعالجة المحتوى ديناميكيًا (الفرز/التصفية/الإخفاء) دون تحديث عنوان URL، هناك عناوين ويب فعلية على موقعك لها قيمة بحث، مثل الفئة الرئيسية وصفحات المنتج، والتي يمكن الزحف إليها وفهرستها. حاول ألا تستخدم فقط الصفحة الرئيسية(أي عنوان URL واحد) لموقعك بالكامل، ومن خلال JavaScript قم بتغيير المحتوى ديناميكيًا من خلال التنقل - وهذا، للأسف، سيمنح المستخدمين عنوان URL واحدًا فقط في عمليات البحث. بالإضافة إلى ذلك، تأكد من أن الأداء لا يؤثر على أداء التصفية الديناميكية للأسوأ، لأنه سيتعارض مع قدرة المستخدم على العمل مع الموقع.

قم بتحسين فهرسة الصفحات المختلفة لنفس المحتوى عن طريق تحديد السمة rel = "canonical" في الإصدار المميز من الصفحة. يمكن استخدام السمة rel = "canonical" في نطاق واحد أو أكثر.

قم بتحسين فهرسة المحتوى المقسم إلى صفحات (على سبيل المثال، الصفحة=1 والصفحة=2 من فئة "الحلوى الصمغية") عن طريق إما:

  • أضف سمة rel="canonical" إلى سلسلة من الصفحات التي تشير إلى الفئة الأساسية باستخدام المعلمة "عرض الكل" (على سبيل المثال، الصفحة=1، والصفحة=2، والصفحة=3 من فئة "الحلوى اللزجة" مع rel = "canonical" على class=gummy-candies&page=all)، مع التأكد من أن الصفحة ذات صلة بالمستخدمين ويتم تحميلها بسرعة.
  • استخدم ترميز ترقيم الصفحات rel="next" وrel="prev" للإشارة إلى العلاقة بين الصفحات الفردية (راجع "Paginaton مع rel="next" وrel="prev" ").
قم بتضمين الروابط الأساسية فقط في ملفات Sitemap الخاصة بك.

لقد ألقينا نظرة سريعة على التثبيت والتركيب الأساسي لـ PINQ، وهو منفذ LINQ إلى PHP. في هذه المقالة، سنلقي نظرة على كيفية استخدام PINQ لمحاكاة ميزة البحث متعدد الأوجه في MySQL.

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

يعمل البحث النموذجي ذو الأوجه على النحو التالي:

  • يقوم المستخدم بإدخال كلمة أساسية، أو عدة كلمات رئيسية، للبحث. على سبيل المثال، "جهاز التوجيه" للبحث عن المنتجات التي تظهر فيها كلمة "جهاز التوجيه" في الوصف والكلمات الرئيسية واسم الفئة والعلامات وما إلى ذلك.
  • يعرض الموقع قائمة بالمنتجات المطابقة لهذه المعايير.
  • يوفر الموقع عدة روابط لتخصيص مصطلحات البحث الخاصة بك. على سبيل المثال، قد يسمح لك بتحديد شركات تصنيع معينة لجهاز التوجيه، أو تعيين نطاق سعري، أو ميزات أخرى.
  • يمكن للمستخدم الاستمرار في تحديد معايير بحث إضافية من أجل الحصول على مجموعة البيانات محل الاهتمام.

البحث ذو الأوجه يحظى بشعبية كبيرة وهو كذلك أداة قوية، ويمكن ملاحظته على أي موقع ويب متعلق بالتجارة الإلكترونية تقريبًا.

لسوء الحظ، البحث متعدد الأوجه غير مدمج في MySQL. فماذا يجب أن نفعل إذا كنا لا نزال نستخدم MySQL، ولكننا نريد منح المستخدم هذه الفرصة؟

باستخدام PINQ، الذي يتبع نهجًا مشابهًا وقويًا وبسيطًا، يمكننا تحقيق نفس السلوك كما لو كنا نستخدم محركات قواعد بيانات أخرى.

توسيع التجريبي من الجزء الأول

تعليق: كل ​​التعليمات البرمجية من هذا الجزء، ومن الجزء الأول، يمكن العثور عليها في المستودع.

في هذه المقالة، سوف نتوسع في العرض التوضيحي من الجزء الأول مع تحسين كبير في شكل البحث متعدد الأوجه.

لنبدأ بـ Index.php ونضيف إليه الأسطر التالية:

$app->get("demo2"، الوظيفة () استخدم ($app) ( global $demo; $test2 = new pinqDemo\Demo($app); إرجاع $test2->test2($app, $demo->test1 ($التطبيق)); $app->get("demo2/facet/(key)/(value)"، الوظيفة ($key, $value) use ($app) ( global $demo; $test3 = new pinqDemo\Demo($app); إرجاع $test3->test3($app, $demo->test1($app), $key, $value ));

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

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

لكن في هذا المثال لن ننفذ هذا السلوك - ستعكس جميع المرشحات القيم الحدودية لمجموعة البيانات الأصلية. هذا هو القيد الأول والمرشح الأول للتحسين في العرض التوضيحي الخاص بنا.

كما ترون في الكود أعلاه، الوظائف الفعلية موجودة في ملف آخر يسمى pinqDemo.php. دعونا نلقي نظرة على الكود المقابل الذي يوفر ميزة البحث ذات الأوجه.

فئة الجانب

أولاً، لنقم بإنشاء فئة تمثل جانبًا ما. بشكل عام، يجب أن يحتوي الجانب على عدة خصائص:

  • البيانات التي تعمل عليها ( بيانات $)
  • المفتاح الذي يتم من خلاله تنفيذ التجميع ( مفتاح $)
  • نوع المفتاح (نوع $). يمكن أن يكون واحدًا مما يلي:
    • تحديد السلسلة الكاملة لمطابقة تامة
    • تحديد جزء من السلسلة (عادةً ما يكون الجزء الأولي) للبحث حسب النمط
    • تشير إلى نطاق من القيم، للتجميع حسب النطاق
  • إذا كان نوع المفتاح عبارة عن نطاق من القيم، فأنت بحاجة إلى تحديد خطوة قيمة لتحديد الحدود الدنيا والعليا للنطاق؛ أو إذا كان النوع جزءًا من سلسلة، فيجب عليك تحديد عدد الأحرف الأولى التي سيتم استخدامها للتجميع ($range)

التجميع- الجزء الأكثر أهمية من الجانب. تعتمد كافة المعلومات المجمعة التي قد يتمكن الجانب من إرجاعها على معايير التجميع. عادةً ما تكون معايير البحث الأكثر استخدامًا هي "سلسلة كاملة" أو "جزء من سلسلة" أو "نطاق القيم".

Namespace classFacet (استخدم Pinq\ITraversable، Pinq\Traversable؛ class Facet ( public $data; // مجموعة البيانات الأصلية public $key; // الحقل الذي يتم من خلاله تجميع النوع العام $; // F: الصف بأكمله؛ S: سلاسل البداية R: range; public $range; // يلعب دورًا فقط إذا كان $type!= F ... public function getFacet() ( $filter = ""; if ($this->type == "F") / / السطر بأكمله ( ... ) elseif ($this->type == "S") // بداية السطر ( ... ) elseif ($this->type == "R") // نطاق القيم ​​( $ filter = $this->data ->groupBy(function($row) ( return Floor($row[$this->key] / $this->range) * $this->range; )) -> حدد(وظيفة (ITraversable $data) ( return ["key" => $data->last()[$this->key], "count" => $data->count()]; )); return $ مرشح؛))))

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

ضبط الجوانب وعرض البيانات المصدرية

اختبار الوظيفة العامة2($app, $data) ( $facet = $this->getFacet($data); return $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "data" => $data)); public function getFacet($originalData) ( $facet = array(); $data = \Pinq\Traversable::from($originalData); // 3 أمثلة إنشاء مختلفة كائنات الجانب وإرجاع الجوانب $filter1 = new \classFacet\Facet($data, "author", "F"); $filter2 = new \classFacet\Facet($data, "title", "S", 6) $filter3 = new \classFacet\Facet($data, "price", "R, 10); $facet[$filter1->key] = $filter1->getFacet() ] = $filter2->getFacet(; ); $facet[$filter3->key] = $filter3->getFacet();

في طريقة getFacet() نقوم بما يلي:

  • قم بتحويل البيانات الأصلية إلى كائن Pinq\Traversable لمزيد من المعالجة
  • نحن نخلق ثلاثة جوانب. سيتم تجميع جانب "المؤلف" حسب حقل المؤلف، وتنفيذ التجميع حسب الصف بأكمله؛ الجانب "العنوان" - حسب حقل العنوان مع التجميع حسب جزء من السطر (حسب الأحرف الستة الأولى)؛ الجانب "السعر" - حسب حقل السعر مع التجميع حسب النطاق (بزيادات 10)
  • أخيرًا، نقوم باستخراج الجوانب وإعادتها إلى الدالة test2 حتى يمكن إخراجها إلى القالب للعرض

جوانب الإخراج والبيانات التي تمت تصفيتها

في معظم الحالات، سيتم عرض عوامل التصفية كخط، وسوف تقودك إلى عرض النتيجة التي تمت تصفيتها.

لقد قمنا بالفعل بإنشاء مسار ("demo2/facet/(key)/(value)") لعرض نتائج البحث ذات الأوجه وتصفية الروابط.

يأخذ المسار معلمتين، اعتمادًا على المفتاح الذي يتم تصفيته بواسطة وقيمة هذا المفتاح. تظهر أدناه وظيفة test3 المرتبطة بهذا المسار:

اختبار الوظيفة العامة3($app, $originalData, $key, $value) ( ​​$data = \Pinq\Traversable::from($originalData); $facet = $this->getFacet($data); $filter = null; if ($key == "author") ( $filter = $data ->where(function($row) use ($value) ( ​​​​return $row["author"] == $value; )) ->orderByAscending( function($row) use ($key) ( return $row["price"]; )) ) elseif ($key == "price") (... ) else //$key== title ( .. . ) return $app["twig"]->render("demo2.html.twig", array("facet" => $facet, "data" => $filter)) )

بشكل أساسي، اعتمادًا على المفتاح، نقوم بتطبيق التصفية (وظيفة مجهولة في بيان المكان) وفقًا للقيمة التي تم تمريرها ونحصل على المجموعة التالية من البيانات المصفاة. يمكننا أيضًا ضبط ترتيب تصفية البيانات.

وأخيرًا، نقوم بعرض البيانات الأولية (مع المرشحات) في القالب. يستخدم هذا المسار نفس النمط الذي استخدمناه في "demo2".

شريط البحث

    (% لـ k، v في الوجه %)
  • ((ك|الأحرف الكبيرة))
    • (% لـ vv في v %)
    • ((vv.count))((vv.key))
    • (%endfor%)
    (%endfor%)

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

يحتوي كل جانب على مصفوفة ذات قيمة مفتاحية، لذا يمكننا التكرار عليها باستخدام الطرق العادية.

لاحظ كيف نبني عناوين URL لروابطنا. نستخدم كلاً من مفتاح الحلقة الخارجية (k) ومفاتيح الحلقة الداخلية (vv.key) كمعلمات للمسار ("demo2/facet/(key)/(value)"). يتم استخدام حجم المصفوفات (vv.count) للعرض في القالب.

تُظهر الصورة الأولى مجموعة البيانات الأصلية، ويتم تصفية الصورة الثانية حسب النطاق السعري من 0 دولار إلى 10 دولارات، ويتم فرزها حسب المؤلف.

رائع، لقد تمكنا من محاكاة البحث متعدد الأوجه في تطبيقنا!

قبل اختتام هذه المقالة، نحتاج إلى إلقاء نظرة أخيرة على مثالنا وتحديد ما يمكن تحسينه وما هي القيود التي لدينا.

التحسينات الممكنة

بشكل عام، هذا مثال أساسي جدًا. لقد استعرضنا للتو التركيب والمفاهيم الأساسية وقمنا بتنفيذها كمثال عملي. وكما ذكرنا سابقًا، لدينا العديد من المجالات التي يمكن تحسينها لتحقيق قدر أكبر من المرونة.

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

قيود

يتضمن بحث الواجهة الذي تم تنفيذه في هذه المقالة قيودًا خطيرة (والتي قد تنطبق أيضًا على تطبيقات بحث الواجهة الأخرى):

نقوم بجلب البيانات من MySQL في كل مرة

يستخدم هذا التطبيق إطار عمل Silex. كما هو الحال مع أي إطار عمل لنقطة دخول واحدة مثل Silex وSymfony وLaravel، يتم استدعاء ملف Index.php (أو app.php) الخاص به في كل مرة يتم فيها تحليل المسار وتنفيذ وظائف وحدة التحكم.

إذا نظرت إلى الكود الموجود في ملف Index.php الخاص بنا، ستلاحظ أن السطر التالي من الكود:

$demo = new pinqDemo\Demo($app);

يتم استدعاؤه في كل مرة يتم فيها عرض صفحة التطبيق، مما يعني أنه يتم تنفيذ أسطر التعليمات البرمجية التالية في كل مرة:

عرض توضيحي للفئة ( كتب خاصة $ = ""؛ وظيفة عامة __construct($app) ( $sql = "اختر * من ترتيب book_book حسب المعرف"; $this->books = $app["db"]->fetchAll($sql ;)

هل سيكون من الأفضل عدم استخدام الإطار؟ حسنًا، على الرغم من أن تطوير التطبيقات بدون أطر عمل ليس فكرة جيدة، إلا أنني أستطيع القول إننا سنواجه نفس المشكلات: لا يتم الاحتفاظ بالبيانات (والحالة) بين طلبات HTTP المختلفة. هذه هي الخاصية الأساسية لـ HTTP. يمكن تجنب ذلك باستخدام آليات التخزين المؤقت.

لقد أنقذنا بعض استعلامات SQLباستخدام الجوانب. بدلاً من تمرير استعلام تحديد واحد لاسترداد البيانات، وثلاثة استعلامات مجمعة حسب عبارات المكان المقابلة، قمنا بتشغيل استعلام واحد فقط، واستخدمنا PINQ للحصول على المعلومات المجمعة.

خاتمة

في هذا الجزء، قمنا بتطبيق القدرة على البحث في مجموعة من الكتب. وكما قلت، هذا مجرد مثال صغير، به مجال للتحسين، وبه عدد من القيود.

يمثل التنقل متعدد الأوجه مشكلة لجميع مواقع التجارة الإلكترونية. يشكل العدد الزائد من الصفحات المستخدمة لأشكال مختلفة لنفس العنصر تهديدًا لكفاءة البحث. يمكن أن يؤثر هذا سلبًا على تحسين محركات البحث وتجربة المستخدم. شرح خبراء من مدونة SEO Hacker ماهية التنقل متعدد الأوجه وكيفية تحسينه.

التنقل ذو الأوجه: التعريف

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

الأوجه والمرشحات تختلف عن بعضها البعض. وهنا الفرق:

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

  • تُستخدم عوامل التصفية لفرز العناصر وتحسينها داخل القوائم. فهي ضرورية للمستخدمين، ولكن ليس لمحركات البحث. لا تتم فهرسة عوامل التصفية لأنها لا تغير محتوى الصفحة، ولكنها تقوم فقط بفرزها بترتيب مختلف. وينتج عن هذا عناوين URL متعددة تحتوي على محتوى مكرر.

المشاكل المحتملة

تحتوي كل مجموعة أوجه محتملة على عنوان URL الفريد الخاص بها. يمكن أن يسبب بعض المشاكل من منظور تحسين محركات البحث. فيما يلي أهمها:

  • محتوى مكرر.
  • إهدار الميزانية على المسح الضوئي.
  • إزالة الاختلافات الارتباط.

مع نمو موقعك، يزداد أيضًا عدد الصفحات المكررة. قد تنتقل الروابط الواردة إلى صفحات مكررة مختلفة. وهذا يقلل من قيمة الروابط ويحد من قدرة الصفحات على الترتيب.

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

حلول الملاحة الأوجه

عند اختيار حل للتنقل متعدد الأوجه، ضع في اعتبارك هدفك النهائي: زيادة عدد الصفحات التي تقوم بفهرستها أو تقليل عدد الصفحات التي لا تريد فهرستها. فيما يلي بعض الحلول التي قد تكون مفيدة لك:

اياكس

إذا كنت تستخدم AJAX، فلن يتم إنشاء عنوان URL جديد عندما ينقر المستخدم على واجهة أو عامل تصفية. نظرًا لعدم وجود عناوين URL فريدة لكل مجموعة جوانب محتملة، فمن المحتمل التخلص من مشكلة المحتوى المكرر وتفكيك الكلمات الرئيسية وتكاليف الفهرسة المهدرة.

لا يمكن أن يكون AJAX فعالاً إلا قبل إطلاق موقع التجارة الإلكترونية. لا يتم استخدامه لحل مشاكل الموارد الموجودة. تتطلب هذه الطريقة أيضًا نفقات معينة من جانبك.

علامة noindex

يتم استخدام علامة noindex لإخبار برامج الروبوت باستبعاد صفحة معينة من الفهرس. بهذه الطريقة لن يظهر في نتائج بحث جوجل. ويساعد هذا في تقليل كمية المحتوى المكرر الذي يظهر في الفهرس ونتائج البحث.

لن يحل هذا مشكلة ميزانية الزحف لأن الروبوتات ستستمر في زيارة صفحتك. كما أنه لا يساعد في توزيع قيمة الروابط.

السمة rel=canonical

باستخدام هذه السمة، فإنك تخبر Google أن لديك صفحة رئيسية واحدة مفضلة لفهرستها وتصنيفها، وأن جميع الإصدارات الأخرى من المحتوى من تلك الصفحة هي مجرد نسخ مكررة ولا تحتاج إلى فهرستها.

صوفيا إبراجيموفا

مسوق المحتوى

إذا كان من الممكن الوصول إلى نفس الصفحة على موقعك من عناوين URL متعددة، فستتعامل روبوتات البحث مع كل عنوان URL كصفحة منفصلة. ستقرر الروبوتات أن المحتوى الموجود على موقعك ليس فريدًا، وسيؤثر ذلك سلبًا على التصنيف ويقلل من موضعك في نتائج البحث. لتجنب ذلك، حدد الصفحة الأساسية الرئيسية عن طريق إدراج التسلسل التالي من الأحرف في كتلة HEAD:

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

ملف الروبوتات.txt

يتيح لك إغلاق بعض الصفحات من الفهرسة تحقيق نتائج جيدة. هذه طريقة بسيطة وسريعة وموثوقة. من الأكثر ملاءمة تعيين معلمة مخصصة لتحديد الكل مجموعات ممكنةالأوجه والمرشحات التي تريد حظرها. قم بتضمينه في نهاية كل عنوان URL تريد إخفاءه (http://full page Address/robots.txt) أو استخدم علامة تعريف Robots في منطقة HEAD من رمز الصفحة.

عند إجراء تغييرات على عنوان URL، ضع في اعتبارك أن الأمر يستغرق من 3 إلى 4 أسابيع حتى تلاحظ الروبوتات هذه التغييرات وتستجيب لها.

هناك مشاكل معينة هنا أيضا. ستكون قيمة الروابط محدودة، وقد تتم فهرسة عنوان URL المحظور بسبب وجود روابط خارجية.

وحدة تحكم بحث جوجل

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

  • تسجيل الدخول حسابوحدة التحكم وحدد قسم "الزحف":

  • انقر على زر "معلمات URL":

  • وضح التأثير الذي سيحدثه كل إعداد من إعداداتك على الصفحة وكيف تريد أن يتعامل Google مع تلك الصفحات.

تذكر أن هذه الطريقة تخفي فقط المحتوى المكرر من برامج زحف Google. ستظل الصفحات تظهر في Bing وYahoo.

كيفية تحسين التنقل الأوجه

دعونا نفكر بإيجاز في جميع الطرق التي تسمح لك بإنشاء التنقل الصحيح متعدد الأوجه:

  • باستخدام أجاكس
  • قم بإزالة أو إخفاء الروابط إلى الفئات أو تصفية الصفحات التي تفتقد المحتوى.
  • السماح بفهرسة مجموعات معينة من الجوانب التي لها حجم كبير من حركة البحث
  • إعداد تسلسل هرمي للموقع من خلال مسارات التنقل في الفئات والفئات الفرعية.
  • إنشاء صفحات أساسية (رئيسية) للمحتوى المكرر.
  • دمج خصائص الفهرسة من الصفحات المكونة عبر السلسلة بأكملها باستخدام ترميز الصفحة مع rel="next" و rel="prev" .

خاتمة

كل من الحلول المذكورة لها مزاياها وعيوبها. لا يوجد حل عالمي؛ كل هذا يتوقف على تفاصيل عملك والحالة المحددة. سيسمح التنقل المحسّن للأوجه لموقعك باستهداف نطاق أوسع من الكلمات الرئيسية. لتجنب المخاطر، تأكد من أن التنقل لا يلبي متطلبات روبوتات البحث فحسب، بل يوفر أيضًا تجربة مستخدم جيدة.

المرشح الذكي أو البحث ذو الأوجه هو مرشح حسب فئة المنتج، والذي يمكن رؤيته في المتاجر الكبيرة عبر الإنترنت ونفس Yandex.market. يساعدك على فرز المنتجات باستمرار ضرورية للمستخدمالخصائص، والتخلص من كل ما هو غير ضروري. يعد هذا خيارًا مناسبًا للغاية يتيح لك العثور بسرعة على المنتج أو المادة المطلوبة على الموقع.

ولذا دعونا ننتقل مباشرة إلى تثبيت وتكوين الوحدات التي نحتاجها

أولاً، سنحتاج إلى تنزيل الوحدات التالية وتثبيتها: Search API، وSearch API Database Search، وEntity API، وViews.

في صفحة الوحدات نقوم بتمكين:

  • بحث API
  • طرق عرض البحث
  • بحث في قاعدة البيانات
  • واجهة برمجة تطبيقات الكيان
  • وجهات النظر
  • واجهة المستخدم للمشاهدات
  • أدوات ك

إنشاء خادم البحث

دعنا نذهب إلى التكوين > البحث والبيانات الوصفية >بحث API(/admin/config/search/search_api) ثم انقر أضف الخادم.
ثم أدخل اسم الخادم في القائمة المنسدلة فئة الخدمةيختار خدمة قاعدة البياناتوحفظ.

إنشاء فهرس

دعنا نذهب إلى التكوين > البحث والبيانات الوصفية >بحث API(/admin/config/search/search_api)، انقر أضف الخادم (إضافة فهرس).
أدخل اسم الفهرس في الحقل نوع العنصر (نوع العنصر)يختار ' مادة"، في الميدان الخادميختار خادم قاعدة البيانات، انقر إنشاء فهرس.


في النموذج الذي يفتح، حدد المربعات التي سيتم من خلالها إجراء الفرز وحفظه.
لتتمكن من الفرز حسب اسم العقدة، قم بتشغيل العنوان وحدد النوع المقابل له في القائمة المنسدلة خيط، لا نص كامل. لا يمكنك الفرز حسب النص الكامل.

في النموذج التالي الذي يفتح المرشحات(سير العمل) تركت كل شيء كإعداد افتراضي، انتقل إلى علامة التبويب منظر (حالة)، ثم اضغط الفهرس الآن (الفهرس الآن).
بعد الانتهاء من الفهرسة، سنقوم بإنشاء صفحة بحث.

إنشاء صفحة بحث

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


التالي، انقر فوق حفظ وتكوين(متابعة وتحرير)قم بإعداد العرض كالمعتاد. في معايير التصفية، أضفت عرض المواد المنشورة فقط ونوع العقدة المطلوبة وقمت بتكوين عرض الحقول الضرورية (تحتاج إلى إضافة هذه الحقول إلى الفهرس حتى تتمكن من التصفية حسبها).

في هذه المرحلة، انتهينا من إعداد العرض؛ فلننتقل الآن مباشرةً إلى عامل التصفية الجانبي.

A/search_api_ranges.module +++ b/search_api_ranges.module @@ -144,11 +144,8 @@ function search_api_ranges_minmax($variables, $order = "ASC") (// وإلا فإن الحد الأدنى/الحد الأقصى لدينا يساوي المستخدم دائمًا input $filters = &$query->getFilter()->getFilters(); foreach ($filters as $key => $filter) ( - - // التحقق من المصفوفة: مرشحات النمط القديم هي كائنات يمكننا تخطيها. - if (is_array($filter)) ( - if ($filter == $variables["range_field"] || ($filter != $variables["range_field"] && $filter == "")) ( - $ current_filter = $filters[$key] + if(isset($filter->tags) && is_array($filter->tags))( + if(in_array("facet:".$variables["range_field"], $ مرشح->العلامات))( unset($filters[$key]); ) )

تصحيح JQuery UI Slider: إعداد إعادة التوجيه

في الإصدار 7x-1.5 من الوحدة، واجهت حقيقة أنه إذا كانت أداة شريط التمرير موجودة على صفحة أخرى غير صفحة البحث، فبعد تغيير النطاق السعري، تتم إعادة توجيه الاتجاه إلى الصفحة الحالية، وليس إلى البحث صفحة.
الخطأ يكمن في الوظيفة search_api_ranges_block_slider_view_form_submit()(ملف search_api_ranges.module، السطر 364).
لم أبحث حقًا عما كان هناك ولماذا، لقد قمت للتو بتغيير الكود قليلاً في السطر 427:

Drupal_goto($path, array("query" => array($params), "language" => $language)); + drupal_goto($values["path"], array("query" => array($params), "language" => $language));

وبعد ذلك تم حل المشكلة.

© 2024 ermake.ru - حول إصلاح أجهزة الكمبيوتر - بوابة المعلومات