पिनक्यू - पूछताछ किए गए डेटासेट। पहलू खोज

अंतर्निहित पहलू खोज उत्पाद में निर्मित

ऑनलाइन स्टोर में निर्मित पहलू खोज - आंतरिक खोज - कई मामलों में तेजी से काम करती है और सिस्टम को लोड नहीं करती है।

  • उत्पाद में निर्मित
  • बहुत तेज
  • साइट लोड नहीं होती
  • इन्फोब्लॉक एपीआई का मुख्य भाग है
  • वेबसाइट को पुनः डिज़ाइन करने की आवश्यकता नहीं है
  • स्वचालित रूप से पुन: अनुक्रमित
क्यों इतनी तेज?

पैरामीटर के किसी भी संयोजन के लिए क्लाइंट को तुरंत पूर्व-तैयार खोज परिणाम प्रस्तुत किए जाते हैं - पहलू। सिस्टम किसी उत्पाद के लिए पहलुओं की पहले से गणना करता है - फ़िल्टर में इन गुणों के सभी संभावित प्रतिच्छेदन। ये तैयार खोज सेट फिर ग्राहकों को जारी किए जाते हैं।

साइट लोड क्यों नहीं होती?

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

ग्राहकों के लिए लाभ

पहलूगत खोज के लाभ आपका ग्राहक फ़िल्टर सेटिंग्स के साथ आसानी से खेलते हुए उत्पाद को बहुत तेज़ी से ढूंढता है। ग्राहक इंतजार नहीं करता और तुरंत परिणाम प्राप्त करता है। खोज गति कैटलॉग में आइटमों की संख्या पर निर्भर नहीं करती है।


स्मार्ट फ़िल्टर 2.0

ग्राहक को उत्पाद तुरंत मिल जाता है

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

अन्तरक्रियाशीलता और बहुआयामीता

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

सुविधा और मित्रता

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

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


खोज गति

खोज गति मायने रखती है खोज गति की गई खरीदारी की संख्या को प्रभावित करती है

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


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

खोज इतनी धीमी क्यों है?
स्टोरफ्रंट पर किसी उत्पाद की खोज करने में सामान्य पेज लोडिंग समय से काफी अधिक समय लग सकता है। विशेषकर यदि स्टोर में बड़ी संख्या में उत्पाद हों और इन उत्पादों के गुण हों। प्रश्न खोजनाकई मायनों में यह बहुत सारे डेटाबेस कॉल बनाता है और साइट को महत्वपूर्ण रूप से लोड करता है। यदि बहुत सारे ग्राहक और अनुरोध हैं, तो खोज काफी धीमी हो जाती है।

काम की गति प्रभावशाली है! 500 हजार वस्तुओं वाले कैटलॉग की तीन श्रेणियों पर उत्पाद के संस्करण 15.0 के परीक्षण परिणामों से पता चला कि पिछले संस्करणों की तुलना में:
  • स्मार्ट फ़िल्टर घटक - 15 गुना तेज़!
  • कैटलॉग घटक – 5 गुना तेज़!
खोज खुफिया निरंतर बनी रहती है!
बिना किसी "पहलू" के भी तेज़! उत्पाद कैटलॉग घटकों को गति देने के लिए लगातार काम कर रहा है। "साइट स्पीड" सेवा संस्करण दर संस्करण गति में उल्लेखनीय वृद्धि दर्शाती है!

पुनर्निर्माण

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

डेवलपर्स के लिए: एपीआई पारदर्शिता


पिछला देखें

"पहलू" एपीआई के लिए पारदर्शी है उत्पाद में निर्मित "पहलू" एपीआई के लिए पारदर्शी है। यह इन्फोब्लॉक एपीआई का मुख्य भाग है। इसलिए, इसका उपयोग करने के लिए डेवलपर्स को अतिरिक्त प्रयास की आवश्यकता नहीं होती है। साइटों को फिर से डिज़ाइन करने की भी कोई आवश्यकता नहीं है।
  • CIBlockElement::GetList विधि को तेज़ करना
  • स्मार्ट फिल्टर के साथ पूर्ण एकीकरण
GetList अब तेजी से काम करता है क्योंकि यह स्वचालित रूप से कार्य करने के लिए एक "पहलू" जोड़ता है। D7 पर एक अलग एपीआई भी है।

स्मार्ट फिल्टर के साथ पूर्ण एकीकरण

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



स्मार्ट फ़िल्टर में संपत्ति दिखाएँ

अनुकूलित किया जा सकता है!

स्मार्ट फ़िल्टर अब और अधिक सुंदर दिखता है. डेवलपर्स इसके स्वरूप को आसानी से अनुकूलित और आगे अनुकूलित कर सकते हैं।

हमने LINQ से PHP के पोर्ट, PINQ की स्थापना और बुनियादी सिंटैक्स पर एक त्वरित नज़र डाली। इस लेख में, हम देखेंगे कि MySQL में पहलू खोज सुविधा को अनुकरण करने के लिए PINQ का उपयोग कैसे करें।

इस लेख में हम पहलू खोज के सभी पहलुओं को शामिल नहीं करेंगे। इच्छुक लोग इंटरनेट पर उपयुक्त जानकारी खोज सकते हैं।

एक विशिष्ट पहलू खोज इस तरह काम करती है:

  • उपयोगकर्ता खोजने के लिए एक कीवर्ड या कई कीवर्ड दर्ज करता है। उदाहरण के लिए, "राउटर" उन उत्पादों की खोज करने के लिए है जिनमें "राउटर" शब्द विवरण, कीवर्ड, श्रेणी नाम, टैग आदि में दिखाई देता है।
  • साइट इन मानदंडों से मेल खाने वाले उत्पादों की एक सूची लौटाती है।
  • साइट आपके खोज शब्दों को अनुकूलित करने के लिए कई लिंक प्रदान करती है। उदाहरण के लिए, यह आपको विशिष्ट राउटर निर्माताओं को निर्दिष्ट करने, या मूल्य सीमा, या अन्य सुविधाएँ निर्धारित करने की अनुमति दे सकता है।
  • उपयोगकर्ता रुचि के डेटा सेट को प्राप्त करने के लिए अतिरिक्त खोज मानदंड निर्दिष्ट करना जारी रख सकता है।

फेसेटेड सर्च काफी लोकप्रिय और एक शक्तिशाली टूल है जिसे लगभग किसी भी ई-कॉमर्स वेबसाइट पर देखा जा सकता है।

दुर्भाग्यवश, पहलूबद्ध खोज MySQL में निर्मित नहीं है। तो अगर हम अभी भी MySQL का उपयोग करते हैं, लेकिन उपयोगकर्ता को यह अवसर देना चाहते हैं तो हमें क्या करना चाहिए?

PINQ के साथ, जिसका दृष्टिकोण समान, शक्तिशाली और सरल है, हम वैसा ही व्यवहार प्राप्त कर सकते हैं जैसे कि हम अन्य डेटाबेस इंजनों का उपयोग कर रहे थे।

पहले भाग से डेमो का विस्तार करना

ध्यान दें: इस भाग और पहले भाग के सभी कोड रिपॉजिटरी में पाए जा सकते हैं।

इस लेख में, हम पहलू खोज के रूप में एक महत्वपूर्ण सुधार के साथ भाग 1 से डेमो का विस्तार करेंगे।

आइए Index.php से शुरू करें और इसमें निम्नलिखित पंक्तियाँ जोड़ें:

$app->get("demo2", function() उपयोग ($app) (ग्लोबल $demo; $test2 = newpinqDemo\Demo($app); return $test2->test2($app, $demo->test1 ($ऐप)); )); $app->get("demo2/facet/(key)/(value)", function ($key, $value) उपयोग ($app) (ग्लोबल $demo; $test3 = newpinqDemo\Demo($app); वापसी $test3->test3($app, $demo->test1($app), $key, $value); ));

पहला मार्ग हमें खोज से मेल खाने वाली सभी प्रविष्टियों को देखने के लिए एक पृष्ठ पर ले जाता है कीवर्ड. उदाहरण को सरल बनाए रखने के लिए, हम Book_book तालिका से सभी पुस्तकों का चयन करते हैं। यह परिणामी डेटा सेट और खोज मानदंड निर्दिष्ट करने के लिए लिंक का एक सेट भी प्रदर्शित करेगा।

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

लेकिन इस उदाहरण में हम इस व्यवहार को लागू नहीं करेंगे - सभी फ़िल्टर मूल डेटा सेट के सीमा मूल्यों को प्रतिबिंबित करेंगे। यह हमारे डेमो में सुधार के लिए पहली सीमा और पहला उम्मीदवार है।

जैसा कि आप ऊपर दिए गए कोड में देख सकते हैं, वास्तविक फ़ंक्शंस एक अन्य फ़ाइल में स्थित हैं जिसे PinqDemo.php कहा जाता है। आइए संबंधित कोड पर एक नज़र डालें जो पहलूबद्ध खोज सुविधा प्रदान करता है।

पहलू वर्ग

पहला कदम एक ऐसा वर्ग बनाना है जो एक पहलू का प्रतिनिधित्व करता हो। सामान्य तौर पर, एक पहलू में कई गुण होने चाहिए:

  • यह जिस डेटा पर काम करता है ($डेटा)
  • वह कुंजी जिसके द्वारा समूहीकरण किया जाता है ($कुंजी)
  • कुंजी प्रकार ($प्रकार). निम्नलिखित में से एक हो सकता है:
    • सटीक मिलान के लिए पूर्ण स्ट्रिंग निर्दिष्ट करें
    • पैटर्न के आधार पर खोजने के लिए स्ट्रिंग के भाग (आमतौर पर प्रारंभिक वाला) को इंगित करें
    • श्रेणी के आधार पर समूहीकरण के लिए मानों की श्रेणी इंगित करें
  • यदि कुंजी प्रकार मानों की एक श्रेणी है, तो आपको श्रेणी की निचली और ऊपरी सीमा निर्धारित करने के लिए एक मान चरण परिभाषित करने की आवश्यकता है; या यदि प्रकार एक स्ट्रिंग का हिस्सा है, तो आपको यह निर्दिष्ट करना होगा कि समूहीकरण के लिए कितने पहले अक्षरों का उपयोग किया जाएगा ($रेंज)

समूहीकरण पहलू का सबसे महत्वपूर्ण हिस्सा है। किसी पहलू द्वारा लौटाई जा सकने वाली सभी एकत्रित जानकारी समूहीकरण मानदंड पर निर्भर करती है। आमतौर पर सबसे अधिक उपयोग किए जाने वाले खोज मानदंड "पूर्ण स्ट्रिंग", "स्ट्रिंग का हिस्सा", या "मानों की श्रेणी" हैं।

नेमस्पेस क्लासफ़ेसेट (Pinq\ITraversable, Pinq\Traversable का उपयोग करें; क्लास Facet (सार्वजनिक $डेटा; // मूल डेटा सेट सार्वजनिक $कुंजी; // फ़ील्ड जिसके द्वारा सार्वजनिक $प्रकार को समूहीकृत किया जाए; // F: संपूर्ण पंक्ति; S: प्रारंभ स्ट्रिंग्स ; R: रेंज; सार्वजनिक $रेंज; // केवल तभी भूमिका निभाता है यदि $type != F ... सार्वजनिक फ़ंक्शन getFacet() ( $filter = ""; if ($this->type == "F") / / पूरी पंक्ति (...) अन्यथा ($यह->प्रकार == "एस") // पंक्ति की शुरुआत (...) अन्यथा ($यह->प्रकार == "आर") // मानों की श्रेणी ​​( $ फ़िल्टर = $यह->डेटा ->groupBy(फ़ंक्शन($पंक्ति) ( रिटर्न फ़्लोर($पंक्ति[$यह->कुंजी] / $यह->श्रेणी) * $यह->श्रेणी; )) -> चयन करें (फ़ंक्शन (आईट्रैवर्सबल $डेटा) ( वापसी ["कुंजी" => $डेटा->अंतिम()[$यह->कुंजी], "गिनती" => $डेटा->गिनती()]; )); ) वापसी $फ़िल्टर; ) ) )

इस वर्ग का मुख्य कार्य मूल डेटासेट और पहलू गुणों के आधार पर फ़िल्टर किए गए डेटासेट को वापस करना है। कोड से यह स्पष्ट है कि वे विभिन्न प्रकार के खातों के लिए उपयोग करते हैं विभिन्न तरीकेडेटा समूहीकरण. उपरोक्त कोड में, हमने दिखाया कि यदि हम डेटा को $range में निर्दिष्ट वृद्धि में मानों की एक श्रृंखला के आधार पर समूहित करते हैं तो कोड कैसा दिख सकता है।

पहलुओं को सेट करना और स्रोत डेटा प्रदर्शित करना

सार्वजनिक फ़ंक्शन टेस्ट2($ऐप, $डेटा) ( $facet = $this->getFacet($data); रिटर्न $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "डेटा" => $data)); ) निजी फ़ंक्शन 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(); $facet[$filter2-> कुंजी ] = $filter2->getFacet(); $facet[$filter3->key] = $filter3->getFacet(); वापसी $facet; )

GetFacet() विधि में हम निम्नलिखित कार्य करते हैं:

  • आगे की प्रक्रिया के लिए मूल डेटा को Pinq\Traversable ऑब्जेक्ट में बदलें
  • हम तीन पहलू बनाते हैं। 'लेखक' पहलू लेखक क्षेत्र के अनुसार समूहित होगा, और पूरी पंक्ति के अनुसार समूहीकरण लागू करेगा; पहलू 'शीर्षक' - पंक्ति के भाग द्वारा समूहीकरण के साथ शीर्षक फ़ील्ड द्वारा (पहले 6 वर्णों द्वारा); पहलू 'कीमत' - सीमा के आधार पर समूहीकरण के साथ मूल्य क्षेत्र द्वारा (10 की वृद्धि में)
  • अंत में, हम पहलुओं को निकालते हैं और उन्हें test2 फ़ंक्शन पर लौटाते हैं ताकि उन्हें प्रदर्शन के लिए टेम्पलेट में आउटपुट किया जा सके
आउटपुट पहलू और फ़िल्टर किए गए डेटा

अधिकांश मामलों में, फ़िल्टर एक पंक्ति के रूप में प्रदर्शित होंगे, और आपको फ़िल्टर किए गए परिणाम देखने के लिए प्रेरित करेंगे।

हमने पहलूबद्ध खोज परिणाम और फ़िल्टर लिंक प्रदर्शित करने के लिए पहले से ही एक मार्ग ("डेमो2/पहलू/(कुंजी)/(मूल्य)") बना लिया है।

मार्ग दो पैरामीटर लेता है, जो फ़िल्टर की गई कुंजी और उस कुंजी के मान पर निर्भर करता है। इस मार्ग से जुड़ा test3 फ़ंक्शन नीचे दिखाया गया है:

सार्वजनिक फ़ंक्शन टेस्ट3($ऐप, $ओरिजिनलडेटा, $की, $वैल्यू) ($डेटा = \Pinq\ट्रैवर्सेबल::फ्रॉम($ओरिजिनलडेटा); $facet = $this->getFacet($data); $filter = शून्य; यदि ($कुंजी == "लेखक") ( $फ़िल्टर = $डेटा ->कहां(फ़ंक्शन($पंक्ति) उपयोग ($मान) ( ​​वापसी $पंक्ति["लेखक"] == $मूल्य; )) ->orderByAscending( function($row) उपयोग ($key) ( return $row["price"]; )) ; ) elseif ($key == "price") ( ... ) else //$key== शीर्षक ( .. . ) वापसी $app["twig"]->render("demo2.html.twig", array("facet" => $facet, "data" => $filter)); )

मूल रूप से, कुंजी के आधार पर, हम पारित मूल्य के अनुसार फ़िल्टरिंग (कहां कथन में एक अज्ञात फ़ंक्शन) लागू करते हैं और फ़िल्टर किए गए डेटा का निम्नलिखित सेट प्राप्त करते हैं। हम डेटा फ़िल्टरिंग का क्रम भी निर्धारित कर सकते हैं।

अंत में, हम टेम्पलेट में कच्चा डेटा (फ़िल्टर के साथ) प्रदर्शित करते हैं। यह मार्ग उसी पैटर्न का उपयोग करता है जिसका उपयोग हमने "डेमो2" में किया था।

खोज पट्टी

    (के के लिए %, पहलू में वी %)
  • ((k|कैपिटलाइज़))
    • (वीवी में वीवी के लिए %)
    • ((vv.गिनती))((vv.key))
    • (%endfor%)
    (%endfor%)

हमें यह याद रखने की आवश्यकता है कि हमारे एप्लिकेशन द्वारा उत्पन्न पहलू नेस्टेड सरणियाँ हैं। पहले स्तर पर, यह सभी पहलुओं की एक श्रृंखला है, और, हमारे मामले में, उनमें से तीन हैं (क्रमशः लेखक, शीर्षक, मूल्य के लिए)।

प्रत्येक पहलू में एक कुंजी-मूल्य सरणी होती है, इसलिए हम सामान्य तरीकों का उपयोग करके इसे पुनरावृत्त कर सकते हैं।

ध्यान दें कि हम अपने लिंक के लिए यूआरएल कैसे बनाते हैं। हम रूट ("डेमो2/फेसेट/(की)/(वैल्यू)") के पैरामीटर के रूप में बाहरी लूप कुंजी (के) और आंतरिक लूप कुंजी (vv.key) दोनों का उपयोग करते हैं। टेम्प्लेट में प्रदर्शन के लिए सरणियों का आकार (vv.count) का उपयोग किया जाता है।

पहली छवि मूल डेटा सेट दिखाती है, और दूसरी छवि $0 से $10 तक मूल्य सीमा के अनुसार फ़िल्टर की जाती है, और लेखक द्वारा क्रमबद्ध की जाती है।

बढ़िया, हम अपने एप्लिकेशन में पहलूबद्ध खोज का अनुकरण करने में सक्षम थे!

इस लेख को समाप्त करने से पहले, हमें अपने उदाहरण पर अंतिम नज़र डालने और यह निर्धारित करने की आवश्यकता है कि क्या सुधार किया जा सकता है और हमारी क्या सीमाएँ हैं।

संभावित सुधार

सामान्य तौर पर, यह एक बहुत ही बुनियादी उदाहरण है. हमने अभी मूल वाक्यविन्यास और अवधारणाओं पर गौर किया है और उन्हें एक कामकाजी उदाहरण के रूप में लागू किया है। जैसा कि पहले कहा गया है, हमारे पास ऐसे कई क्षेत्र हैं जिनमें अधिक लचीलेपन के लिए सुधार किया जा सकता है।

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

प्रतिबंध

इस आलेख में कार्यान्वित पहलू खोज की गंभीर सीमाएँ हैं (जो अन्य पहलू खोज कार्यान्वयनों पर भी लागू हो सकती हैं):

हम हर बार MySQL से डेटा लाते हैं

यह एप्लिकेशन सिलेक्स फ्रेमवर्क का उपयोग करता है। सिलेक्स, सिम्फनी, लारवेल जैसे किसी भी एकल प्रवेश बिंदु ढांचे की तरह, इसकी इंडेक्स.php (या ऐप.php) फ़ाइल को हर बार रूट पार्स किए जाने और नियंत्रक फ़ंक्शन निष्पादित होने पर कॉल किया जाता है।

यदि आप हमारे Index.php में कोड को देखते हैं, तो आप देखेंगे कि कोड की निम्नलिखित पंक्ति:

$डेमो = नया पिनकडेमो\डेमो($ऐप);

हर बार एप्लिकेशन पेज प्रस्तुत किए जाने पर कॉल किया जाता है, जिसका अर्थ है कि कोड की निम्नलिखित पंक्तियां हर बार निष्पादित होती हैं:

क्लास डेमो (निजी $किताबें = ""; सार्वजनिक फ़ंक्शन __construct($app) ($sql = "आईडी द्वारा बुक_बुक ऑर्डर से * चुनें"; $this->books = $app["db"]->fetchAll($sql ); )

क्या यह बेहतर होगा यदि हम किसी ढाँचे का उपयोग न करें? खैर, इस तथ्य के बावजूद कि फ्रेमवर्क के बिना एप्लिकेशन विकसित करना एक अच्छा विचार नहीं है, मैं कह सकता हूं कि हमें समान समस्याओं का सामना करना पड़ेगा: डेटा (और स्थिति) अलग-अलग के बीच सहेजे नहीं जाते हैं HTTP अनुरोध. यह HTTP की एक मूलभूत विशेषता है. कैशिंग तंत्र का उपयोग करके इससे बचा जा सकता है।

हमने पहलुओं का उपयोग करके कई SQL क्वेरीज़ सहेजी हैं। डेटा को पुनः प्राप्त करने के लिए एक चुनिंदा क्वेरी और संबंधित व्हेयर क्लॉज के साथ प्रश्नों के आधार पर तीन समूह पास करने के बजाय, हमने केवल एक व्हेयर क्वेरी चलाई, और एकत्रित जानकारी प्राप्त करने के लिए पिनक्यू का उपयोग किया।

निष्कर्ष

इस भाग में, हमने पुस्तकों के संग्रह को पहलू खोज करने की क्षमता लागू की। जैसा कि मैंने कहा, यह केवल एक छोटा सा उदाहरण है, जिसमें सुधार की गुंजाइश है और जिसकी कई सीमाएँ हैं।

( "क्वेरी": ( "और": [ ("शर्तें": ("देश": ["हो", "fr"]) ), ( "शर्तें": ("श्रेणी": ["किताबें", "मूवीज़ " "]) ) ] ) )

काउंटरों के लिए, हम Elasticsearch से अंतर्निहित एकत्रीकरण का उपयोग कर सकते हैं। दोनों पहलुओं में से प्रत्येक को सूचकांक में एक एकल फ़ील्ड के रूप में संग्रहीत किया जाता है, इसलिए हम इनमें से प्रत्येक फ़ील्ड में शब्दों के एकत्रीकरण का उपयोग कर सकते हैं। एकत्रीकरण इस फ़ील्ड के मान के लिए एक काउंटर लौटाएगा।

( "क्वेरी": ( "और": [ ("शर्तें": ("देश": ["हो", "fr"]) ), ( "शर्तें": ("श्रेणी": ["किताबें", "मूवीज़ " "]) ) ]), "एकत्रीकरण": ("देश": ("शर्तें": ("फ़ील्ड": "देश")), "श्रेणियाँ": ( "शर्तें": ("फ़ील्ड": "श्रेणी" ) ) ) )

यदि आप यह क्वेरी चलाएंगे, तो आप देखेंगे कि काउंटर अक्षम हैं। दो अचयनित देशों, पुर्तगाल और ब्राज़ील, का काउंटर 0 है। हालाँकि यदि हम उन्हें चुनना चाहते हैं तो वास्तविक परिणाम हैं (ओरिनर एज के कारण)। ऐसा इसलिए होता है, क्योंकि डिफ़ॉल्ट रूप से, Elasticsearch परिणाम सेट पर अपना एकत्रीकरण करता है। इसका मतलब यह है कि यदि आप फ़्रांस का चयन करते हैं, तो अन्य देश के फ़िल्टर का स्कोर 0 होगा क्योंकि परिणाम सेट में केवल फ़्रांस के आइटम शामिल हैं।

इसे ठीक करने के लिए, हमें Elasticsearch को क्वेरी को अनदेखा करते हुए संपूर्ण डेटासेट पर एकत्रीकरण करने के लिए कहना होगा। हम अपने समूहों को वैश्विक के रूप में परिभाषित करके ऐसा कर सकते हैं।

( "क्वेरी": ( "और": [ ("शर्तें": ("देश": ["हो", "fr"]) ), ( "शर्तें": ("श्रेणी": ["किताबें", "मूवीज़ " "]) ) ]), "एकत्रीकरण": ( "all_products": ( "वैश्विक": (), "एकत्रीकरण": ( "देश": ( "शर्तें": ("फ़ील्ड": "देश")), "श्रेणियाँ": ("शर्तें": ("फ़ील्ड": "श्रेणी") ) ) ) ) )

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

( "क्वेरी": ( "और": [ ("शर्तें": ("देश": ["हो", "fr"]) ), ( "शर्तें": ("श्रेणी": ["किताबें", "मूवीज़ " "]) ) ]), "एकत्रीकरण": ( "all_products": ( "वैश्विक": (), "एकत्रीकरण": ( "देश": ( "फ़िल्टर": ( "और": [ ("शर्तें":) ("श्रेणी": ["किताबें", "फिल्में"]) ) ] ), "एकत्रीकरण": ( "फ़िल्टर_देश": ( "शर्तें": ("फ़ील्ड": "देश") ) ) ), "श्रेणियाँ": ( "फ़िल्टर": ( "और": [ ("शर्तें": ("देश": ["be","fr"]) ) ]), "एकत्रीकरण": ( "फ़िल्टर_श्रेणियां": ("शर्तें": ( "फ़ील्ड": "श्रेणी") ) ) ) ) ) ) )

( "लिया गया": 153, "टाइम्ड_आउट": गलत, "_शार्ड्स": ( "कुल": 5, "सफल": 5, "असफल": 0), "हिट": ( "कुल": 3, "मैक्स_स्कोर ": 0, "हिट": ["..."]), "एकत्रीकरण": ( "सभी_उत्पाद": ( "doc_count": 21, "फ़िल्टर की गई श्रेणियां": ( "doc_count": 13, "श्रेणियां": ( "doc_count_error_upper_ound": 0, "sum_other_doc_count": 0, "buckets": [( "key": "movies", "doc_count": 6 ), ( "key": "music", "doc_count": 4 ), ( "कुंजी": "किताबें", "doc_count": 3 ) ] ) ), "filtered_countries": ( "doc_count": 15, "देश": ( "doc_count_error_upper_ound": 0, "sum_other_doc_count": 0, "बाल्टी": [( "कुंजी": "fr", "doc_count": 6 ), ( "कुंजी": "br", "doc_count": 4 ), ( "कुंजी": "be", "doc_count": 3 ), ( "कुंजी": "पीटी", "doc_count": 2 ) ] ) ) ) ) )

Yii2 फ्रेमवर्क $terms = QueryHelper::terms('categories.name' , 'mycategory' ) ; $नेस्टेड = क्वेरीहेल्पर:: नेस्टेड ("स्ट्रिंग_फेसेट", क्वेरीहेल्पर:: फिल्टर ([क्वेरीहेल्पर:: टर्म ("स्ट्रिंग_फेसेट.फेसेट_नाम", ["वैल्यू" => $आईडी, "बूस्ट" => 1 ] ), क्वेरीहेल्पर:: शब्द ("string_facet.facet_value" , ​​​[ "मान" => $मूल्य , "बूस्ट" => 1 ] ) , ] ) ) ; $फ़िल्टर = क्वेरी हेल्पर::चाहिए ($नेस्टेड);

आज के पाठ में हम जावास्क्रिप्ट का उपयोग करके पहलू खोज की नकल को फिर से बनाने का प्रयास करेंगे। मैं मान रहा हूं कि यदि आप इस ट्यूटोरियल को पढ़ रहे हैं तो आप पहले से ही जानते हैं कि पहलूगत खोज क्या है, अन्यथा इसे गूगल पर खोजें या अमेज़ॅन या मेरे डेमो को देखें।

सबसे पहले हमें लाइब्रेरी github.com/eikes/facetedsearch की आवश्यकता है। इसे डाउनलोड करें औरfacetedsearch.js फ़ाइल को हमारे प्रोजेक्ट से कनेक्ट करें। हमें jQuery और अंडरस्कोर लाइब्रेरी की भी आवश्यकता होगी।

अस्वीकरण: मैं समझता हूं कि जेक्यू अब केक नहीं है, लेकिन मैं इसे परिचित वाक्यात्मक चीनी के रूप में उपयोग करता हूं, आप इसे अपने से अधिक परिचित पुस्तकालयों के लिए या वेनिला जेएस में फिर से लिख सकते हैं।

तो, सबसे पहले, आइए कनेक्टेड निर्भरताओं के साथ एक सरल मार्कअप बनाएं:

दस्तावेज़ // यहां हम पहलू फ़िल्टर प्रदर्शित करेंगे // और यहां हमारे तत्व होंगे

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

$(फ़ंक्शन())( var item_template = // टेम्पलेट का वर्णन करें "" + " " वर्ग = "img-उत्तरदायी">" + ", " + "

" + "" + ", " + ", " + "

" + "

" + ""; सेटिंग्स = (आइटम: उदाहरण_आइटम, पहलू: ( // पहलू श्रेणियां निर्दिष्ट करें "श्रेणी": "कौन सी श्रेणी", "महाद्वीप": "कौन सा महाद्वीप", "भाषा": "प्रोग्रामिंग भाषा"), परिणाम चयनकर्ता: "#परिणाम", // DOM तत्व जहां हम परिणाम प्रदर्शित करते हैं पहलू चयनकर्ता: "#facets", // पहलुओं के लिए DOM तत्व परिणाम टेम्पलेट: आइटम_टेम्पलेट, पेजिनेशन गणना: 8, // प्रति पृष्ठ तत्वों की संख्या orderByOptions: ("पहला नाम": " प्रथम नाम ", "अंतिम नाम": "अंतिम नाम", "श्रेणी": "श्रेणी", "रैंडम": "रैंडम"), पहलूसॉर्टऑप्शन: ("महाद्वीप": ["उत्तरी अमेरिका", "दक्षिण अमेरिका"]) ) $.facetelize(सेटिंग्स); ));

खैर, वास्तव में JS में हमारी पहलूगत खोज में प्रदर्शित करने के लिए तत्वों के साथ स्वयं एक JSON सरणी बनाएं:

वार आइटम = [( "प्रथम नाम": "मैरी", "अंतिम नाम": "स्मिथ", "imageURL": "http://lorem Pixel.com/150/150/cats/2", "विवरण": "सेड ईए आमेट। स्टेट वोलुप्टुआ। नोनमी मैग्ना ताकीमाता ", "श्रेणी": "माउस", "भाषा": ["स्मॉलटॉक", "एक्सएसएलटी"], "महाद्वीप": "अफ्रीका" ​​), ( "प्रथमनाम": "पेट्रीसिया ", "अंतिम नाम": "जॉनसन", "imageURL": "http://lorem Pixel.com/150/150/cats/3", "विवरण": "उत ताकीमाता सिट एलिक्वीम लेबोरे एलिक्वियम सिट सिट लोरेम अमेट। इप्सम रिबम ।" , "श्रेणी": "शेर", "महाद्वीप": "उत्तरी अमेरिका", ... ];

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

बस इतना ही, हमें जावास्क्रिप्ट में एक पहलूपूर्ण खोज मिलती है और हम इसे अनुकूलित कर सकते हैं। इसके बाद, मैं लाइब्रेरी का अनुवादित दस्तावेज़ उपलब्ध कराता हूँ, जहाँ आप अपनी ज़रूरत के ट्रिगर देख सकते हैं।

दस्तावेज़ीकरण सुविधाएँ

दो फ़ंक्शन jQuery नेमस्पेस में निर्यात किए जाते हैं।

फेसटेलाइज़ का उपयोग दी गई सेटिंग्स के साथ एक फेसेटेड खोज आरंभ करने के लिए किया जाता है।

यदि आप पहलू लुकअप स्थिति को बाहरी रूप से बदलना चाहते हैं तो FacetUpdate का उपयोग किया जा सकता है।

ऑब्जेक्ट सेटिंग्स

आइटम: आइटमों की एक श्रृंखला जिसे प्रक्रिया में फ़िल्टर और सॉर्ट किया जाएगा।

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

orderByOptions: पहलुओं के समान, इन कुंजी-मूल्य जोड़े को छोड़कर केवल सॉर्टिंग के लिए उपयोग किया जाता है। जब RANDOM कुंजी सक्षम होती है, तो परिणामों को यादृच्छिक किया जा सकता है।

पहलू चयनकर्ता: यह एक चयनकर्ता है जिसका उपयोग DOM नोड खोजने के लिए किया जाता है जिससे पहलू फ़िल्टर का चयन किया जाता है।

परिणाम चयनकर्ता: यह एक चयनकर्ता है जिसका उपयोग DOM नोड को खोजने के लिए किया जाता है जहां परिणाम प्रदर्शित होते हैं।

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

स्थिति: यह ऑब्जेक्ट वर्तमान फ़िल्टर, प्रकार: currentResult और अन्य को संग्रहीत करता है। आप उन्हें प्रीसेट करने के लिए ऑर्डरबी स्ट्रिंग या फ़िल्टर ऑब्जेक्ट प्रदान कर सकते हैं।

EnablePagination: पेजिनेशन और "अधिक लोड करें" बटन को सक्षम करने के लिए बूलियन, डिफ़ॉल्ट रूप से सत्य है।

पेजिनेशनकाउंट: यदि पेजिनेटर सक्षम है, तो प्रति पेज तत्वों की संख्या निर्धारित करता है, डिफ़ॉल्ट 50 है।

FacetSortOption: पहलू तत्वों के क्रम को बदलने के लिए इस फ़ंक्शन का उपयोग करें। एक ऑब्जेक्ट लेता है जिसकी कुंजियाँ पहलू नामों और मानों से मेल खाती हैं, पहलू मूल्यों की एक सरणी में, जिसे उस क्रम में व्यवस्थित किया जा सकता है जैसा आप चाहते हैं। यह उदाहरण महाद्वीपों को एक अलग क्रम में क्रमबद्ध करेगा, सरणी में शामिल नहीं की गई वस्तुओं को वर्णमाला क्रम में जोड़ देगा:

FacetSortOption: ("महाद्वीप": ["उत्तरी अमेरिका", "दक्षिण अमेरिका"])

कुछ और टेम्पलेट हैं, कृपया देखें स्रोतसभी उपलब्ध टेम्पलेट विकल्प देखने के लिएfacetedsearch.js.

आयोजन

आप कुछ घटनाओं से जुड़ सकते हैं जिन्हें कुछ क्रियाएं होने पर सूचनाएं भेजनी चाहिए। ऐसा करने के लिए, हम jquery इवेंट सिस्टम का उपयोग करते हैं:

Facetuicreated: आप इस फ़ंक्शन को सेटिंग्स.facetSelector DOM तत्व से जोड़ सकते हैं जिसे यूआई बनाए जाने पर सूचित किया जाना चाहिए।

facetedsearchresultupdate: अद्यतन परिणामों की सूचना पाने के लिए आप इस फ़ंक्शन को सेटिंग्स.परिणाम चयनकर्ता DOM तत्व से जोड़ सकते हैं।

Facetedsearchfacetclick: यह ईवेंट तब सक्रिय होता है जब किसी पहलू पर क्लिक किया जाता है और सेटिंग्स.facetSelector तत्व पर सक्रिय किया जाता है। जो पहलू आईडी को तर्क के रूप में प्राप्त करता है।

Facetedsearchorderby: जब सॉर्टिंग तत्व सेटिंग्स.facetSelector तत्व पर क्लिक किया जाता है तो यह ईवेंट सक्रिय हो जाता है। यह आईडी ऑर्डर को एक तर्क के रूप में लेता है।

$(settings.resultSelector).bind('facetedsearchresultupdate', function())( // कुछ करो, शायद ));

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

नोट: पहलू खोज तंत्र सूचना ब्लॉक मॉड्यूल के संस्करण 15.0.1 से उपलब्ध है और घटक के साथ एकीकृत है। एक घटक एक विज़ुअल शेल में डिज़ाइन किया गया एक प्रोग्राम कोड है जो सार्वजनिक रूप से डेटा प्रदर्शित करने के लिए मॉड्यूल का एक विशिष्ट कार्य करता है भाग। हम कोड के इस ब्लॉक को सीधे कोई कोड लिखे बिना वेबसाइट पेजों में डाल सकते हैं। स्मार्ट फ़िल्टर घटक एक सूचना ब्लॉक से चयन के लिए एक फ़िल्टर तैयार करता है और फ़िल्टरिंग तत्वों के लिए एक फ़िल्टर फॉर्म प्रदर्शित करता है। कैटलॉग तत्वों को प्रदर्शित करने के लिए घटक को घटक से पहले कनेक्ट किया जाना चाहिए, अन्यथा तत्वों की सूची फ़िल्टर नहीं की जाएगी। घटक मानक है, मॉड्यूल वितरण में शामिल है और इसमें तीन टेम्पलेट शामिल हैं: .default, Visual_horizontal और Visual_vertical। (अंतिम दो टेम्पलेट समर्थित नहीं हैं, वे संगतता बनाए रखने के लिए बने रहेंगे।)

विज़ुअल एडिटर में, घटक पथ के साथ स्थित होता है सामग्री > कैटलॉग > स्मार्ट फ़िल्टर.

घटक सूचना ब्लॉक मॉड्यूल से संबंधित है।

पहलू खोज के बारे में और जानें

आइए एक उदाहरण देखें:

हम ऑनलाइन स्टोर पर जाते हैं और फ़िल्टर में चयन करते हैं कि हमें लाल टी-शर्ट चाहिए:

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

आइए कुछ सरल चरणों में पहलू सूचकांक बनाएं:

क्या पहलू अनुक्रमणिका को पुनः बनाने की आवश्यकता है?

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

खुद ब खुद नए जोड़े गए या मौजूदा उत्पादों को संपादित किया गया।
नई संपत्तियां न बनाएं.
मैन्युअल रूप से सिस्टम आपको पृष्ठों के शीर्ष पर एक संदेश का उपयोग करके इसके बारे में संकेत देगा
प्रशासनिक अनुभाग.
कैटलॉग के नए या संपादित अनुभाग जोड़े गए।
स्मार्ट फ़िल्टर से कोई नया जोड़ते समय या किसी प्रॉपर्टी को हटाते समय।
माल उतारते समय, उदाहरण के लिए, 1C से, यदि माल नई संपत्तियाँ बनाता है।

पहलूबद्ध खोज उत्पाद सूची के प्रदर्शन में सुधार करती है। इसका उपयोग करने के लिए आपको चाहिए:

  • उत्पाद सूची के लिए पहलूबद्ध अनुक्रमणिका बनाएं;
  • अनुक्रमणिका को मैन्युअल रूप से पुनः बनाने की आवश्यकता के बारे में सूचनाओं पर नज़र रखें।
  • विषय पर प्रकाशन