एक ऑनलाइन स्टोर के लिए स्फिंक्स खोज कॉन्फ़िगर करें

स्फिंक्स पर उतनी जानकारी नहीं है, जितनी हम चाहेंगे। अतिरिक्त लेख चोट नहीं करता है।
स्फिंक्स के विकास में पहले कदमों ने मुझे लेख बनाने में मदद की, एक वास्तविक परियोजना पर स्फिंक्स + php और स्फिंक्स उदाहरण खोज पर एक परिचयात्मक खोज इंजन बनाना - टेकडॉक ऑटो पार्ट्स स्टोर मैं आपको उनके साथ शुरू करने की सलाह देता हूं।


कुछ समय के लिए, क्वेरी के प्रत्येक शब्द के लिए LIKE के माध्यम से एक खोज मेरी साइट पर काम करती है। मैं और अधिक चाहता था, और यहाँ कुछ मामले हैं जिन्हें अब सही ढंग से संभाला जाएगा:


  • शब्द रूप। "स्क्रू" और "स्क्रू" का आउटपुट समान होना चाहिए।
  • शब्द के टुकड़े से खोजें।
  • गैर-पूर्णांक संख्याओं के लिए खोजें। विभाजक डॉट और अल्पविराम।
  • पत्र वाई
  • सामान्य गलतियाँ। उदाहरण के लिए, "सदमे अवशोषक"।
  • समानार्थी। नियामक और ईएससी।
  • भाषा। mAh और mAh, B और V, AAA लैटिन और सिरिलिक।
  • अक्षर और संख्याओं से बना शब्द। 10x15x4, 6000mAh

स्रोत अनुभाग और वैकल्पिक छँटाई


समस्या को पहले स्टॉक में आइटम होना चाहिए, फिर अस्थायी रूप से अनुपस्थित, फिर संग्रहीत होना चाहिए। और इन तीनों समूहों को प्रासंगिकता के आधार पर क्रमबद्ध किया जाना चाहिए। ऐसा करने के लिए, आपको विशेषताओं को सेट करने की आवश्यकता है। मेरे मामले में, ये स्रोत sphinx.conf अनुभाग की निकासी और in_stock फ़ील्ड हैं


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 में सूचकांक अनुभाग


आकारिकी = तना_नु
आकृति विज्ञान मेरी पहली समस्या हल करता है। 'बियरिंग्स', 'बियरिंग्स', 'बियरिंग्स' की खोज से एकल परिणाम प्राप्त होगा।


स्टेम (स्टेम_नुरु) तेज होते हैं, लेमेस (लेमेटमाइजर_रू) अधिक सटीक होते हैं। मैंने केवल तमाम कोशिशें कीं। चुनाव आपके शब्दकोष प्रतिस्थापन के शब्दकोश को प्रभावित करेगा। बदलना चाहते हैं - आपको फिर से लिखना होगा।


min_word_len = 1
किसी भी लंबाई के सूचकांक शब्द।


html_strip = 1
Html टैग हटाएं


min_infix_len = 1
खोज शब्द के एक टुकड़े पर होगी। 1 अक्षर तक सूचकांक के टुकड़े। चूंकि मेरे पास डेटाबेस में 10,000 से कम आइटम हैं, इसलिए मैं सूचकांक पर नहीं बचा।


Expand_keywords = 1
स्वचालित रूप से क्वेरी को फ़ॉर्म में ले जाता है "(रनिंग | रनिंग | = रनिंग)"। min_infix_len और Extended_keywords RV2205 को जारी करने के लिए RV 2205 का कारण बनेंगे। वैसे, एक डैश एक स्पेस के बराबर एक विभाजक है। तो RV-2205 वही RV2205 देगा।


charset_table = 0..9, A..Z-> az, _, a..z, U + 410..U + 42F-> U + 430..U + 44F, U + 430..U + 44 एफ, यू + 401-> यू + 0435, यू + 451-> यू + 0435
हम निचले मामले में लैटिन वर्णमाला और सिरिलिक वर्णमाला लाते हैं। E ई के साथ बदलें।


मिश्रण_चर =, और, यू + 2 सी, यू + 2 ई
मेरे पास बहुत सारे गैर-पूर्णांक संख्याएं हैं। उन्हें पूरी तरह से अनुक्रमित करने की आवश्यकता है। U + 2C और U + 2E एक बिंदु और एक अल्पविराम हैं। उदाहरण के लिए, 1.25 को '1.25', '1' और '25' के रूप में अनुक्रमित किया जाएगा।


regexp_filter = (\ d +), ((d d)) => \ 1. 2
संख्याओं में दशमलव स्थान को अवधि और अल्पविराम से अलग किया जा सकता है: "1.75", "1.75"। हम सब कुछ मुद्दे पर लाते हैं


समानार्थी और टाइपो


माप की इकाइयाँ रूसी या अंग्रेजी में लिखी जा सकती हैं: mm-mm, mAh-mAh, mW-mW। पर्यायवाची के शब्दकोष में जोड़ें, जिस पथ को शब्दों में निर्दिष्ट किया गया है: "मच> मह"। मैं अपनी प्राथमिकताओं के अनुसार सूचकांक के लिए भाषा चुनता हूं।


आकृति विज्ञान हैंडलर के बाद प्रतिस्थापन को लागू करने के लिए ~ संकेत इंगित करता है। यह आपको सभी शब्द रूपों को लिखने की अनुमति नहीं देता है और 'क्रस्ट', 'क्रस्ट', 'क्रस्ट' के लिए नियमों के बजाय "~ कॉर्क> बॉडी" लिखता है।


मेरी सूची पूरी हो गई है:


 ~ > 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), लेकिन अधिक बार एक विशेषता (100mAh, 10x15x4mm)। अक्षरों और सूचकांक से सभी संख्याओं को अलग करें।


यह कई समस्याओं को हल करेगा:


  • किसी को '10x15x4' असर होगा, किसी को '15x10x4' असर होगा। अनुक्रमित संख्याओं के परिणामस्वरूप सही आउटपुट होगा।
  • माप की इकाइयाँ संख्या से अलग नहीं हो सकती हैं या नहीं हो सकती हैं: "1.75 मिमी", "1.75 मिमी"।
  • शीर्षकों के लिए, यह भी उपयोगी है। सही आउटपुट तीन रिकॉर्डिंग विकल्पों 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 

हम "मिमी" को त्याग देते हैं, क्योंकि उन्हें अक्सर उत्पाद के नाम पर संकेत नहीं दिया जाता है।
एक stop.txt फ़ाइल बनाएं और इसे stopwords में लिखें।
सामग्री:


  mm 

अब PHP के बारे में थोड़ा


स्फिंक्सापी को जल्द या बाद में वंचित किया जाएगा। हम Sphinxql का उपयोग करेंगे। ऐसा करने के लिए, डेटाबेस से कनेक्ट करें। मेरे मामले में, स्फिंक्स होस्टिंग के माध्यम से जुड़ा हुआ है, यह इस तरह दिखता है:


 $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 के साथ सभी संचार फ़िल्टर किए गए क्वेरी टेक्स्ट को सेलेक्ट करने वाला एक सेलेक्ट है


 $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 आईडी IN () के माध्यम से डेटा चयन इस छँटाई का उल्लंघन करेगा। प्रत्येक आईडी के लिए अपना अनुरोध बनाना होगा।


डिबगिंग चरण में , चयन क्वेरी के तुरंत बाद SHOW META क्वेरी बहुत मदद करती है। खासतौर पर डिक्शनरी वर्डफॉर्म और रेगुलर एक्सप्रेशन फिल्टर की जांच के लिए। आप उन कीवर्ड की सूची देख सकते हैं जिनमें क्वेरी का विस्तार हुआ है।


शिकायत करना sql_query


हम स्पेयर पार्ट्स बेचते हैं। मैंने उत्पाद श्रेणी का नाम और मॉडल का नाम जोड़ने का फैसला किया, जिसके लिए अतिरिक्त भाग को सूचकांक में जोड़ने का इरादा है। लेकिन प्रत्येक उत्पाद को एक साथ कई श्रेणियों में बांधा जा सकता है और कई मॉडलों के लिए उपयुक्त हो सकता है। और मैंने GROUP_CONCAT फ़ंक्शन की खोज की। यह आपको एक स्ट्रिंग में समूहीकृत करके डेटा प्राप्त करने की अनुमति देता है। उदाहरण के लिए, category.name फ़ील्ड में चयनित आइटम_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/hi439018/


All Articles