2012-10-15 18 views
11

मैं एक webshop बनाने currenlty हूँ। यह दुकान उपयोगकर्ताओं category द्वारा उत्पादों फिल्टर करने के लिए अनुमति देता है, और एक जोड़ी वैकल्पिक अतिरिक्त फ़िल्टर ऐसे brand, color, आदिPHP, MySQL, कुशल टैग-संचालित खोज एल्गोरिदम

फिलहाल के रूप में, विभिन्न गुणों विभिन्न स्थानों में जमा हो जाती है, लेकिन मैं एक करने के लिए स्विच करना चाहते हैं टैग-आधारित प्रणाली।

  • product_id
  • tag_url_alias (अद्वितीय)
  • tag_type (अद्वितीय) (श्रेणी, product_brand, product_color, आदि)
  • tag_value (अद्वितीय नहीं: आदर्श रूप में, मेरी डेटाबेस टैग निम्न डेटा के साथ संग्रहीत करना चाहिए)

प्रथम उद्देश्य

मैं product_id की खोज करना चाहूंगा जो कहीं भी से 1-5 विशेष टैग के बीच जुड़े हुए हैं। टैग एक एसईओ अनुकूल यूआरएल से निकाले जाते हैं। तो मैं प्रत्येक टैग के लिए एक अद्वितीय तार (tag_url_alias) पुनर्प्राप्त कर दूंगा, लेकिन मुझे tag_type नहीं पता होगा। खोज, एक चौराहे हो जाएगा तो मेरी खोज product_id की कि सभी प्रदान की tags की से मेल लौटना चाहिए।

दूसरा उद्देश्य

उत्पादों है कि वर्तमान फिल्टर से मेल खाते प्रदर्शित इसके अलावा, मैं भी अन्य श्रेणियों और फ़िल्टर जो उपयोगकर्ता की आपूर्ति कर सकते हैं के लिए उत्पाद गिनती प्रदर्शित करना चाहते हैं।

Shoe + Black + Adidas 

अब, दुकान के एक आगंतुक जिसके परिणामस्वरूप उत्पादों और आश्चर्य जो काले जूते अन्य ब्रांडों की पेशकश करने के लिए है पर विचार करना चाह सकते हैं:

उदाहरण के लिए, मेरे वर्तमान खोज उत्पादों है कि टैग से मेल के लिए है। इसलिए वे "ब्रांड" फ़िल्टर पर जा सकते हैं, और अन्य सूचीबद्ध ब्रांड्स का चयन कर सकते हैं। कहते हैं कि चलो वे 2 अलग अलग विकल्प हैं निम्नलिखित खोजें जिसका परिणाम (व्यवहार में, यह शायद कई और अधिक होगा),:

Shoe + Black + Nike > 103 results 
Shoe + Black + K-swiss > 0 results 

इस मामले में, अगर वे ब्रांड देख "कश्मीर स्विस" एक उपलब्ध के रूप में सूचीबद्ध अपने फ़िल्टर में choise, उनकी खोज 0 परिणाम वापस आ जाएगी।

यह स्पष्ट रूप से उपयोगकर्ता के लिए निराशाजनक है ... मुझे बहुत पता है कि "एडिडास" से "के-स्विस" में "ब्रांड" को स्विच करने से 0 परिणाम होंगे, और फ़िल्टर से पूरे विकल्प को हटा दें ।

यही बात श्रेणियों, रंग, आदि

के लिए चला जाता है व्यवहार में यह केवल एक पृष्ठ दृश्य केवल फ़िल्टर उत्पाद सूची मेरा प्राथमिक उद्देश्य में वर्णित वापस नहीं होगा मतलब होगा, लेकिन संभावित समान अभी तक अलग-अलग सूचियां के सैकड़ों। प्रत्येक फ़िल्टर मान के लिए एक जो अन्य फ़िल्टर मान को प्रतिस्थापित कर सकता है, या मौजूदा फ़िल्टर मानों में जोड़ा जा सकता है।

क्षमता

मुझे लगता है मेरी डेटाबेस अंत में शामिल होंगे:

250 के बीच और 1.000 अद्वितीय टैग

और यह शामिल होंगे:

10,000 और 100,000 के बीच

अद्वितीय उत्पाद

वर्तमान विचार

मैं कुछ Google खोजों किया था और निम्न आलेख पाया: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

उस लेख से परखने के बाद, प्रश्नों के सैकड़ों चल 2 उद्देश्य को प्राप्त करने, एक दर्दनाक धीमी मार्ग होने जा रहा है। "विषाक्त" उदाहरण मेरी आवश्यकताओं के लिए काम कर सकता है और यह मेरे पहले उद्देश्य के लिए स्वीकार्य हो सकता है, लेकिन यह दूसरे उद्देश्य के लिए अस्वीकार्य रूप से धीमा होगा।

मैं सोच रहा था कि मैं अलग-अलग प्रश्नों को चला सकता हूं जो tag से संबंधित product_id से संबंधित हैं, उन प्रश्नों को कैश करें, और फिर परिणामों पर चौराहे की गणना करें। लेकिन, क्या मैं MySQL में इन चौराहे की गणना करता हूं? या PHP में? अगर मैं MySQL का उपयोग करता हूं, तो क्या मुझे एक अलग तरीका है कि मुझे इन व्यक्तिगत प्रश्नों को कैश करना चाहिए, या मुझे आवश्यक सभी इंडेक्स की आपूर्ति कर रहा है?

मुझे लगता है कि इन tag/product_id सेटों में से दो के बीच चौराहे को कैश करना भी संभव है। चौराहे की मात्रा इस तथ्य से सीमित होगी कि tag_type में केवल एक विशेष मूल्य हो सकता है, लेकिन मुझे यकीन नहीं है कि इस प्रकार के कैशिंग को कुशलता से प्रबंधित करने का तरीका कैसा है। दोबारा, मुझे नहीं पता कि मुझे इसे MySQL या PHP में करना चाहिए या नहीं। और अगर मैं इसे MySQL में करता हूं, तो इस प्रकार के कैश किए गए परिणामों को स्टोर और गठबंधन करने का सबसे अच्छा तरीका क्या होगा?

+1

यह एक थीसिस है: डी – dynamic

+1

ठीक है, मैं यही प्रश्न पूछता हूं! बधाई महोदय – Weacked

+0

धन्यवाद! मुझे यकीन है कि जवाब मुझे बहुत सारे नए ज्ञान प्रदान करेंगे! –

उत्तर

2

sphinx search engine का उपयोग करके यह जादू आपके लिए बना सकती है। यह बहुत तेज़ है, और यहां तक ​​कि वर्डफॉर्म को भी संभाल सकता है, एसईओ अनुरोधों के साथ क्या उपयोगी हो सकता है।

स्फिंक्स के संदर्भ में, दस्तावेज़ बनाएं - "उत्पाद", टैग द्वारा इंडेक्स, क्वेरी (उदा, MATCH_ALL_WORDS) के लिए उचित रैंकर चुनें और सर्वोत्तम परिणाम प्राप्त करने के लिए विभिन्न टैग संयोजनों के साथ बैच अनुरोध चलाएं। memcahed या किसी अन्य की तरह कैशर्स का उपयोग करना न भूलें।

+0

ठीक है, यह बहुत दिलचस्प लगता है। मुझे आश्चर्य है कि उनके एसक्यूएल समर्थन में क्वेरी @ eX0du5 की तरह कुछ शामिल है ... तो मैं एक विशेष अत्यधिक प्रदर्शन खोज इंजन दोनों का उपयोग करने में सक्षम हो सकता हूं, बल्कि कुछ बहुत ही स्मार्ट प्रश्नों के बजाय सरल लोगों का बोतलबंद। –

+0

स्फिंक्स MySQL-like क्वेरी सिंटैक्स मोड का समर्थन करता है, जिसे स्फिंक्सक कहा जाता है, लेकिन मैं देशी कॉल का उपयोग करना पसंद करता हूं –

2

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन कई सौ प्रश्नों को ट्रिगर करने के बजाय आपके दूसरे उद्देश्य को पूरा करने के लिए एक प्रश्न होना संभव होना चाहिए ... नीचे दी गई क्वेरी बताती है कि यह सामान्य रूप से कैसे काम करना चाहिए। विचार तीन अलग-अलग अनुरोधों को एक साथ जोड़ना और समर्पित मूल्य से समूह करना है और केवल उन लोगों को एकत्र करना है जिनके परिणाम हैं।

SELECT t1.product_id, count(*) FROM tagtable t1, tagtable t2, tagtable t3 WHERE 
t1.product_id = t2.product_id AND 
t2.product_id = t3.product_id AND 
t1.tag_type='yourcategoryforShoe' AND t1.tag_value='Shoe' AND 
t2.tag_type='product_color' AND t2.tag_value='Black' AND 
t3.tag_type='brand' 
GROUP BY t3.tag_value 
HAVING count(*) > 0 
+0

यह बहुत स्मार्ट लगता है! मुझे उस पर कुछ प्रदर्शन परीक्षण चलाने होंगे ... –

संबंधित मुद्दे