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

بعض الملاحظات التمهيدية: Avito هي الخدمة الإعلانية الأكثر شعبية في روسيا. لدينا أكثر من 450 ألف إعلان يوميًا ، ويصل العدد الشهري للزوار الفريدين إلى 35 مليونًا ، مما يجعل أكثر من 140 مليون عملية بحث يوميًا.
سيناريو البحث النموذجي من قبل
دعنا نلقي نظرة على مثال بسيط لكيفية عمل البحث منذ أكثر من عام. لنفترض أنك بحاجة إلى بيانو (حسنًا ، لم لا؟). نذهب إلى الصفحة الرئيسية ، نكتب "بيانو".

في تسليم المجرمين ، ستتلقى على الأرجح المحركين أو خدمات نقل البيانو أو شيء مشابه ، ولكن ليس آلة موسيقية.

يحدث هذا لأنه سيكون لدينا فرز حسب تاريخ التنسيب - ويتم تقديم هذه الخدمات في أغلب الأحيان.

لرؤية البيانو ، تحتاج إلى تحديد الفئة. نضغط على عنوان "الهوايات والترفيه" ، وننزل إلى شجرة الفئات إلى "الآلات الموسيقية" ، ثم "أدوات لوحة المفاتيح".


وفقط بعد ذلك نرى البيانو الذي كنا نبحث عنه.

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

في الجزء العلوي ، ترى أحدث العناصر ذات الصلة.

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

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


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

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

ما الفرق بين البحث والمرشحات
عندما تحدثت في RIT ++ ، كان لدى الجمهور سؤال: ما الفرق بين البحث النصي والفلاتر؟ كل شيء بسيط للغاية. يمكنك أيضًا العثور على الإعلان المطلوب بدون طلب نصي من خلال الانتقال إلى شجرة الفئات. في هذه الحالة ، سيظل البحث يجد السلع والخدمات ، ليس حسب النص المحدد ، ولكن حسب مجموعة المعلمات التي تم تمريرها من المرشحات المقابلة للفئة المحددة.
كل فئة لها مجموعة الفلاتر الخاصة بها. على سبيل المثال ، في فئة "السيارات" - بعض الفلاتر ، في فئة "الأشياء الشخصية" - فلاتر أخرى. أي أن الفلاتر مرتبطة بشكل صارم بفئة ما.
وضع الإعلان في دقيقتين
ظهر ابتكار مهم للبائعين يشعرون به عند إرسال إعلانهم. إذا كان إعلانك لا يحتوي على أي "محظور" أو لم يكن مكررًا - وهو الإعلان الجيد المعتاد - فسوف تراه في الإصدار على الفور تقريبًا. في الواقع ، يستمر هذا التأخير حوالي دقيقتين ، ولكن في حالات نادرة يمكن تمديده حتى 30 دقيقة. في السابق ، كان الإعلان يظهر دائمًا على الموقع بعد نصف ساعة فقط.
أفيتو مساعد
Avito Helper هو امتداد لمتصفح Chrome يعرض سعر منتج مشابه على Avito على مواقع الجهات الخارجية. في الملحق ، يمكنك مقارنة الأسعار في العديد من المتاجر عبر الإنترنت بأسعار Avito ، أو ببساطة البحث عن السلع والخدمات الضرورية في خدمتنا ، دون الانتقال مباشرة إلى موقع الويب أو التطبيق. تمكنا من تنفيذ "المساعد" ، بما في ذلك بفضل التغييرات الجديدة في البنية التحتية.

العمارة
نشر كتلة متجانسة
أفيتو لديه متآلف في PHP. قبل عام ، كانت جميع وظائف البحث التي تعمل في Avito في هذا المتراصة. عمل البحث في وحدة متجانسة مع أربع منصات: Android و iOS ونسخة الجوال في المتصفح وسطح المكتب. لإعطاء الناتج ، تم إنشاء استعلامات SQL المقابلة في أبو الهول داخل هذا الكود ، وكانت المعالجة مستمرة ، وتم إرسال الإخراج بتنسيق JSON أو HTML. ثم شاهد المستخدمون ما كانوا يبحثون عنه.

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

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

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

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

كيف يعمل تنفيذ الاستعلام غير المتزامن على المجمع
يتألف المُجمع من العديد من الملفات الشخصية. ملف التعريف ، تقريبًا ، كيان يمكنك من خلاله الحصول على إعلان من نوع ما أو بطريقة معينة. على سبيل المثال ، يمكن تفسير ذلك من خلال القياس: هناك إعلانات "Premium" و "VIP" وإعلانات عادية على Avito. يتلقى المجمّع طلبًا من المجدول ، بينما يتم تنفيذ الطلبات الموازية لمجموعة الملفات الشخصية المعروفة في المجمع. يحتوي الملف الشخصي على برنامج تشغيل بداخله يصل فعليًا إلى المستوى الأساسي ، في هذه الحالة في أبو الهول ، ولكن يمكن أن يكون أي مصدر بيانات آخر

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

تخزين فهرس البحث
نظرًا لحقيقة أننا نستخدم Kubernetes في الهندسة المعمارية ، في RIT ++ طُلب مني سؤال حول تخزين فهرس البحث - هل يتم تخزينه في Kubernetes؟ لا ، لدينا أبو الهول يعيش على الآلات المادية. في Kubernetes ، نقوم بنشر خدمة بحث تعالج منطق البحث. تحتوي السحابة أيضًا على نموذج فهرس بحث لبيئة التطوير التي يتم تشغيل الاختبارات عليها ، ولكن من غير المرغوب فيه وضع فهرس قتالي هناك ، لأن الخدمات التي تعمل في Kubernetes هي ، أولاً وقبل كل شيء ، خدمات عديمة الجنسية.
تحميل خدمة البحث
الآن هذه الخدمة في المعركة ، تخدم 100 ٪ من الحمل مع بعض الاستثناءات. الحمل الذي يحمله هو حوالي 200 krpm. التأخير: متوسط - حتى 17 مللي ثانية ، 95 بالمائة - حتى 120 مللي ثانية ، 99 بالمائة - حتى 320 مللي ثانية.


إجمالي خدمة البحث
خدمة البحث مكتوبة في Golang ، منتشرة في Kubernetes ، يعمل المجمع بشكل غير متزامن مع العديد من الملفات الشخصية. يعمل ملف التعريف مع برنامج التشغيل المحدد ، يصل برنامج التشغيل إلى مصدر البيانات المحدد ، على سبيل المثال ، أبو الهول. يصل عدد الطلبات التي تخدمها خدمتنا إلى 200 krpm في الوقت الحالي. التأخير: متوسط - حتى 17 مللي ثانية ، 95 بالمائة - حتى 120 مللي ثانية ، 99 بالمائة - حتى 320 مللي ثانية.
تنفيذ الخدمة في نظام العمل
إن مشكلة الوظيفة المزدوجة واضحة تمامًا ، وعلينا دعم قاعدتي تعليمات برمجية يجب أن تؤدي نفس المهمة. نحن بحاجة إلى احتياطي. أطلقنا عليها اسم "القش" - تذكرنا عن "القش الممدود". بالإضافة إلى ذلك ، نحن بحاجة إلى التحكم في حركة المرور ، فمن المستحسن أن تكون سريعة ، من خلال لوحة القيادة.
كيف "القش"
يأتي طلب البحث إلى "Straw" ، الذي يعمل داخل كتلة متجانسة ويمكنه إجراء مكالمة أخرى إما إلى بحث جديد أو بحث قديم. تقوم بإجراء مكالمة إلى بحث جديد ، ويفي به ، وإذا نجح ، نحصل فقط على نتيجة بحث جديد.

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

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

في الوقت نفسه ، زاد تأخير الخدمة بشكل حاد - في الصورة أدناه يمكنك رؤية قمم.

لقد عمل "القشة" على حل هذه الحالة بشكل ملحوظ ، وكانت أخطاء HTTP الناتجة في نفس المستوى - وهي وحدة من الأخطاء لكل Avito. زوارنا لم يلاحظوا أي شيء.

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

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

لنفترض أننا طورنا صيغة ترتيب جديدة. ماذا علينا أن نفعل لتجربتها؟
- في خدمة البحث ، اطرح المُجمِّع المناسب (فليكن "Aggregator 2").
- قم بإنشاء تجربة من خلال لوحة القيادة وقم بربط إحدى المجموعات في هذه التجربة بهذا المجمع.
- الآن ، إذا وصل استعلام في البحث الذي يقع ضمن مجموعة الاختبار ، فإنه ينتقل إلى خدمة البحث على "Aggregator 2".
يمكننا الاستمرار في إنشاء تجارب جديدة وربط مجموعات الاختبار الخاصة بهم بمجمعات جديدة.
إجمالي البنية التحتية للبحث
هناك مجموعة من خوادم Sphinx 3. تحتوي على 13 krps من استعلامات SphinxQL ولديها أكثر من 45 مليون إعلان نشط.
Sphinx 3.0 مستقر ويرضي أدائه. بالمناسبة ، الثنائيات في المجال العام . بالإضافة إلى ذلك ، بفضل Avito ، تم تصوير الميزات الجديدة في Sphinx 3 ، على سبيل المثال ، تشغيل المنتج القياسي من المتجهات ، وتم إصلاح الأخطاء المكتشفة.
نحن نستخدم بنية الخدمة. لدينا خدمة البحث "Iskalo" وخدمة "Avito Assistant". جزء من الوظائف بقي في المونوليث ، لكننا نواصل العمل على قطعه.
الاستنتاجات
خلال العام الماضي ، تم تلقي نظام تطوير وظائف بحث متقدم. أتيحت لنا الفرصة لإجراء تجارب سريعة ومرنة. والآن أصبح البحث عن المستخدمين أكثر ملاءمة وأسرعًا ويساعد بشكل أفضل على حل مشكلاتهم.
ما هي الخطوة التالية
علاوة على ذلك ، سنستمر في إزالة ما تبقى من متراصة: التقديم والفلاتر. سنعمل على تحسين جودة البحث ، والاستمرار في إسعاد زوارنا. أتمنى لك أيضًا.
إذا كانت لديك أسئلة حول عمل البحث ، نود أن نعرف المزيد من التفاصيل الفنية ، اكتب في التعليقات. سأجيب بسرور. بالمناسبة ، تحدث أندريه دروزدوف مؤخرًا في Highload ++ 2018 بتقرير عن تحسين المعايير المتعددة لنتائج البحث ، إليك عرضه التقديمي .