قم بتكوين Sphinx Search لمتجر عبر الإنترنت

لا توجد معلومات كثيرة عن أبو الهول كما نود. المادة الزائدة لا تؤذي.
ساعدتني الخطوات الأولى في إتقان Sphinx على إنشاء المقالات إنشاء محرك بحث تمهيدي على Sphinx + php و Sphinx على سبيل المثال البحث في مشروع حقيقي - متجر Tecdoc لقطع غيار السيارات ، أنصحك أن تبدأ به.


لبعض الوقت ، كان البحث عبر LIKE عن كل كلمة من كلمات الاستعلام تعمل على موقعي. أردت المزيد ، وإليك بعض الحالات التي سيتم التعامل معها الآن بشكل صحيح:


  • أشكال الكلمة. يجب أن يكون ناتج "البراغي" و "البراغي" هو نفسه.
  • البحث عن طريق كلمة شظية.
  • البحث عن أرقام غير عدد صحيح. فاصل نقطة و فاصلة.
  • خطاب ذ
  • الأخطاء الشائعة. على سبيل المثال ، "امتصاص الصدمات".
  • مرادفات منظم و ESC.
  • اللغة mAh و mAh و B و V و AAA اللاتينية والسيريلية.
  • كلمة مصنوعة من الحروف والأرقام. 10x15x4 ، 6000 مللي أمبير

قسم المصدر والفرز الاختياري


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


sql_query = \ SELECT id, `art`, `name`, `clearance`, `in_stock` \ FROM items_zip WHERE show_flag=1 sql_attr_bool = clearance sql_attr_uint = in_stock 

سيتم استخدام هذه الحقول في توليد الإخراج في PHP. سوف أصف أدناه.


قسم الفهرس في sphinx.conf


مورفولوجيا = stem_enru
علم التشكل يحل مشكلتي الأولى. البحث عن "محامل" ، "محامل" ، "محامل" سيؤدي إلى نتيجة واحدة.


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


min_word_len = 1
فهرسة الكلمات من أي طول.


html_strip = 1
إزالة علامات HTML


min_infix_len = 1
البحث سيكون على جزء من الكلمة. شظايا الفهرس تصل إلى 1 حرف. نظرًا لأن لديّ أقل من 10000 عنصر في قاعدة البيانات ، لا أحفظ في الفهرس.


expand_keywords = 1
يؤدي الاستعلام تلقائيًا إلى النموذج "(قيد التشغيل | قيد التشغيل | = قيد التشغيل)". ستتسبب كلمة min_infix_len و expand_keywords في إصدار RV 2205 لإصدار RV2205. بالمناسبة ، الشرطة هي فاصل مكافئ للمسافة. لذلك سوف يعطي RV-2205 نفس RV2205.


charset_table = 0..9 ، A..Z-> a..z، _، a..z، U + 410..U + 42F-> U + 430..U + 44F، U + 430..U + 44F ، U + 401-> U + 0435 ، U + 451-> U + 0435
نأتي الأبجدية اللاتينية والأبجدية السيريلية في الحالة الأدنى. استبدال مع ه.


blend_chars = + ، & ، U + 2C ، U + 2E
لدي الكثير من الأرقام غير الصحيحة. يجب أن تكون مفهرسة بالكامل. U + 2C و U + 2E هما نقطة وفاصلة. على سبيل المثال ، سيتم فهرسة 1.25 كـ "1.25" و "1" و "25".


regexp_filter = (\ d +) \، (\ d +) => \ 1. \ 2
يمكن فصل المنازل العشرية بالأرقام بفواصل وفواصل: "1.75" ، "1.75". نأتي كل شيء إلى هذه النقطة


المرادفات والأخطاء المطبعية


يمكن كتابة وحدات القياس باللغة الروسية أو الإنجليزية: mm-mm ، mAh-mAh ، mW-mW. أضف إلى قاموس المرادفات ، المسار المحدد به في أشكال الكلمات: "mach> mah". اخترت لغة الفهرس وفقًا لتفضيلاتي الخاصة.


تشير علامة ~ إلى تطبيق الاستبدال بعد معالج التشكل. هذا يسمح لك بعدم كتابة جميع أشكال الكلمات وبدلاً من قواعد "القشرة" ، "القشرة" ، "القشرة" ، اكتب "~ cork> body"


قائمتي كاملة:


 ~ > esc  > esc  > mah ~ >  ~ >  ~ > buzz ~ > buzz ~ > buzz ~ > buzz ~ > buzz ~ >  ~ >  ~ >  li-po > lipo ~ >  ~ >   >   >  vtx >  ~ >  lollipop > lolipop battery >  ~ >  ~ >  ~ >  mkF >   > BEC  > BEC ~ >  LED >  ~ >  driver >  ~ >  ~ >   > AAA  > AA  > M mm >   > mW  > V  > A deans > t-plug tplug > t-plug 

إلتصاق الحروف بالأرقام


في بعض الأحيان تكون الأرقام جزءًا من الاسم (مثل LCD5208D) ، ولكنها في أغلب الأحيان مميزة (100 مللي أمبير في الساعة ، 10x15 × 4 مم). افصل جميع الأرقام عن الحروف والفهرس.


هذا سوف يحل العديد من المشاكل:


  • شخص ما سوف يبحث عن "تحمل 10x15x4" ، شخص ما "يحمل 15x10x4". ستؤدي الأرقام المفهرسة إلى الإخراج الصحيح.
  • وحدات القياس قد تكون أو لا تكون مفصولة بمسافة من الرقم: "1.75mm" ، "1.75 mm".
  • للعناوين ، وهذا مفيد أيضا. سيكون الإخراج الصحيح في خيارات التسجيل الثلاثة LCD-5208 و LCD 5208 و LCD5208

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


نزيل x ، هو والنجم بأحجام مثل 10x4x4 M3x10:


 regexp_filter = (\d+)[x\x{0445}\*] => \1 x 

إسقاط ذيول:


 regexp_filter = (\d*\.?\d+)(\D+) => \1 \2 

والرؤساء:


 regexp_filter = (\D+)(\d*\.?\d+) => \1 \2 

نحن نتجاهل "mm" ، حيث لا يشار إليها غالبًا باسم المنتج.
اصنع ملف stop.txt واكتبه في كلمات توقف.
المحتوى:


  mm 

الآن قليلا عن PHP


سيتم إهمال Sphinxapi عاجلاً أم آجلاً. سوف نستخدم Sphinxql. للقيام بذلك ، اتصل بقاعدة البيانات. في حالتي ، يتم وصل Sphinx عبر الاستضافة ، يبدو كما يلي:


 $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => TRUE, ); $dsn = 'mysql:host=127.0.0.1;port=9306;'; $this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt); 

وكل الاتصالات مع Spinxql هي عبارة عن نص استعلام SELECT يحيل المصفاة


 $stmt = $this->pdo->prepare("SELECT `id`, WEIGHT() as `w`, in_stock>0 AS stock FROM `items` WHERE MATCH ('".$search."') ORDER BY clearance ASC, stock DESC, w DESC LIMIT ".$limit." OPTION field_weights=(name=10, art=3, cat_names=3, model_names=3)"); 

لا يفهم SphinxQL التعبيرات في قسم الفرز ORDER BY ، لذلك يجب وضع WEIGHT () و in_stock> 0 في الحقول. بالمناسبة ، الحد الافتراضي هو 20 فقط.


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


من خلال field_weights ، حددنا الحقول التي سيكون لها وزن أكبر.


من خلال استكمال الطلب ، نحصل على صفيف معرف مفروزة. ولكن ، لسوء الحظ ، ينتهك اختيار البيانات من خلال WHERE id IN () هذا الفرز. يجب أن تشكل طلبك لكل معرف.


في مرحلة تصحيح الأخطاء ، يساعد استعلام SHOW META مباشرةً بعد استعلام SELECT كثيرًا. خاصة للتحقق من صيغ الكلمات في القاموس ومرشحات التعبير العادية. يمكنك الاطلاع على قائمة الكلمات الرئيسية التي تم توسيع الاستعلام فيها.


تعقيد sql_query


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


 SELECT items_zip.id, `art`, items_zip.`name`, `clearance`, `in_stock`, GROUP_CONCAT(DISTINCT categories.name SEPARATOR ' ') AS cat_names, GROUP_CONCAT(DISTINCT items.family SEPARATOR ' ') AS model_names FROM items_zip LEFT JOIN items_cat ON items_cat.item_id=items_zip.id LEFT JOIN categories ON categories.id=items_cat.cat_id LEFT JOIN zip_comp ON zip_comp.zip_id=items_zip.id LEFT JOIN items ON zip_comp.model_id=items.id WHERE items_zip.show_flag=1 GROUP BY items_zip.id 

Source: https://habr.com/ru/post/ar439018/


All Articles