खोज प्रकार: जैसे, पूर्ण पाठ या संयुक्त?


48

विभिन्न खोज प्रकारों के बीच अंतर क्या है?

  • पसंद
  • पूर्ण पाठ
  • संयुक्त

मुझे विशेष रूप से दिलचस्पी है कि उन सेटिंग्स के लिए खोज व्यवहार और प्रदर्शन कैसे बदलता है।

जवाबों:


63

हर कोई हमेशा Magento खोज के बारे में शिकायत करता है, लेकिन मेरा मानना ​​है कि यदि आप समय की योजना बना रहे हैं और इसे ठीक से कॉन्फ़िगर कर रहे हैं तो यह वास्तव में अच्छी तरह से काम कर सकता है।


पसंद

कीवर्ड आधारित खोज विधि, आपकी क्वेरी को अलग-अलग शब्दों में तोड़ती है। कक्षा में लाइन 326 से निम्नलिखित देखेंMage_CatalogSearch_Model_Resource_Fulltext::prepareResult()

            $words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
            foreach ($words as $word) {
                $like[] = $helper->getCILike('s.data_index', $word, array('position' => 'any'));
            }
            if ($like) {
                $likeCond = '(' . join(' OR ', $like) . ')';
            }

आप देख सकते हैं कि यह आपकी खोज क्वेरी में प्रत्येक शब्द को विभाजित करता है और उन्हें LIKE स्टेटमेंट में एक साथ जोड़ देता है - आप कुछ इस तरह से समाप्त करते हैं:

WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'

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


पूर्ण पाठ

प्रासंगिकता आधारित खोज - हर खोज क्वेरी को MySQL के MATCH ... AGAINST क्वेरी के आधार पर निर्दिष्ट स्कोर के लिए वर्गीकृत किया जाता है । आप इसे Mage_CatalogSearch_Model_Resource_Helper_Mysql444 की पंक्ति में देख सकते हैं :

public function chooseFulltext($table, $alias, $select)
{
    $field = new Zend_Db_Expr('MATCH ('.$alias.'.data_index) AGAINST (:query IN BOOLEAN MODE)');
    $select->columns(array('relevance' => $field));
    return $field;
}

फुलटेक्स्ट सर्च करते समय डेटाबेस टेबल मैगनेटो का उपयोग करता है catalogsearch_fulltext। एक उदाहरण मूल्य:

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

ये मान कैटलॉग के अंतर्गत 'त्वरित खोज में उपयोग करें' के रूप में आपके द्वारा निर्दिष्ट विशेषताओं से सीधे जुड़े हुए हैं> विशेषताएँ> विशेषताएँ प्रबंधित करें


जोड़ना

सुंदर आत्म व्याख्यात्मक। Mage_CatalogSearch_Model_Resource_Fulltext की लाइन 354 पर एक नज़र डालें :

        if ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_COMBINE) {
                $where .= ($where ? ' OR ' : '') . $likeCond;
        } elseif ($likeCond != '' && $searchType == Mage_CatalogSearch_Model_Fulltext::SEARCH_TYPE_LIKE) {
            $select->columns(array('relevance'  => new Zend_Db_Expr(0)));
            $where = $likeCond;
        }

आप यह देख सकते हैं कि FULLTEXT परिणाम वापस आने के बाद यह सिर्फ LIKE परिणाम जोड़ता है।


ध्यान देने योग्य बातें

  1. मैं बेहतर प्रदर्शन और प्रासंगिक परिणामों के लिए FULLTEXT का उपयोग करने की दृढ़ता से सलाह देता हूं
  2. प्रत्येक विशेषता पर जाएं और विचार करें कि क्या इसे फुलटेक्स इंडेक्स में जोड़ना आवश्यक है या नहीं ('त्वरित खोज में उपयोग करें')
  3. डिफ़ॉल्ट रूप से उत्पाद विवरण FULLTEXT अनुक्रमण में शामिल किए जाते हैं। मैं लगभग हमेशा विवरण हटाता हूं क्योंकि वे प्रासंगिक संदर्भों का उपयोग अप्रासंगिक संदर्भों में उपयोग किए गए शब्दों के साथ करते हैं।
  4. सुनिश्चित करें कि फुलटेक्स इंडेक्स में आपकी मेटा विशेषताओं का उपयोग किया जाता है। उन्हें सार्थक सामग्री के साथ आबाद करें।
  5. MySQL FULLTEXT में कुछ विचित्रताएँ हैं - इसमें अनदेखे शब्दों की एक सूची है जो आपके उत्पाद के नाम इन शब्दों से बने होने पर समस्याग्रस्त हो सकते हैं!
  6. डिफ़ॉल्ट रूप से MySQL 4 वर्णों के अंतर्गत पूर्ण प्रश्नों की उपेक्षा करता है । जब तक आप इस मान को नहीं बदलते हैं, तब तक छोटे मान वाले गुणों को अनदेखा कर दिया जाएगा।

आप संयोजन विधि का उपयोग करके अंक 5 और 6 के आसपास काम कर सकते हैं - LIKE परिणाम किसी भी ऐसे शब्द की भरपाई करनी चाहिए जिसे FULLTEXT ने अनदेखा किया हो।


7

"लाइक" सर्च सामान्य मैच की तरह ही होगा, जैसे '% कीवर्ड%' क्वेरी का उपयोग करते हुए। इस प्रकार की खोज का एक फायदा यह है कि यह आंशिक शब्दों से मेल खाएगी। हालांकि इसमें गंभीर कमियां हैं:

  • जल्दी से एक प्रदर्शन मुद्दा बन जाएगा
  • प्रासंगिकता खराब है। वास्तव में प्रश्नों की तरह "प्रासंगिकता" की कोई अवधारणा नहीं है

फुलटेक्स्ट सर्च MyISAM फुलटेक्स्ट सर्च ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ) का उपयोग करके काम करेगा । आपको इसके बारे में पढ़ना चाहिए, लेकिन संक्षेप में:

  • प्रदर्शन बेहतर है
  • यह स्टॉपवर्ड्स (जैसे "और", "के साथ" आदि को बाहर कर देगा)
  • यह प्रासंगिकता के आधार पर प्रत्येक परिणाम के लिए डिफ़ॉल्ट रूप से एक अंक प्रदान करेगा

फुलटेक्स्ट का दोष यह है कि यह आंशिक मिलान नहीं कर सकता है, अर्थात "फो" की खोज में "फोन" नहीं मिलेगा।

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

जैसा कि अन्य लोगों ने कहा, यदि आप खोज के बारे में गंभीर हैं तो आपको सोल्र का उपयोग करना चाहिए। यह तेजी से रास्ता है और बहुत अधिक प्रासंगिक है। आपको Magento EE का मालिक होना चाहिए और अपने आप को Solr स्थापित करना होगा।


1
इस उत्तर के लिए धन्यवाद। मुझे Magento EE की आवश्यकता क्यों होगी?
PiNNumber

1
सोलर खोज Magento Enterprise (समुदाय की एक विशेषता नहीं) का हिस्सा है। ऐसे एक्सटेंशन हैं जो समुदाय में खोज को कार्यान्वित करेंगे जैसे magentocommerce.com/magento-connect/solr-bridge-search.html । मैंने हालांकि उनका उपयोग नहीं किया।
पॉल ग्रिगोरुटा

6

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

लेकिन यदि आप एक शक्तिशाली खोज समाधान की तलाश कर रहे हैं, तो इस परियोजना की जाँच करें: https://code.google.com/p/magento-solr/ । SOLR बड़े संग्रह की खोज के लिए बनाया गया था और इसे लागू करने में कुछ समय लग सकता है क्योंकि यह इसके लायक होना चाहिए। व्यक्तिगत रूप से मैंने इसे पहले मैगेंटो में इस्तेमाल नहीं किया है, लेकिन अन्य PHP परियोजनाओं पर बहुत अच्छा प्रदर्शन किया है।

पूर्ण पाठ प्रलेखन यहाँ पाया जा सकता है: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html यहाँ प्रलेखन की तरह देखें: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html


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

आप फुलटैक्स के बारे में सही हैं। या तो VPS पर होस्ट करने के लिए या Magento होस्टिंग प्रदान करने वाली कंपनी के साथ हमेशा स्मार्ट होता है। फुलटेक्स्ट कॉन्फिग जैसे विकल्प उपलब्ध होने चाहिए या फिर कम से कम आप उन्हें स्वयं सेट कर सकते हैं। क्या आपके पास कोई 3th पार्टी खोज सुझाव @Fiasco Labs है?
Sander Mangel

@FiascoLabs, तुम कैसे बदल सकता हूँ ORकरने के लिए AND?
माइकल Yaeger

3

LIKE के साथ समस्या यह है कि डिफ़ॉल्ट रूप से "% term%" का उपयोग करता है। मैंने इसे "टर्म%" से मिलान करने के लिए बदल दिया है (शब्द से पहले के स्थान पर ध्यान दें), ताकि यह शब्दों की शुरुआत से मेल खाता हो। मैंने खोज शब्द में अंतिम 's' को काट दिया है ताकि "कार" "कार" के समान परिणाम दे। जाहिर है कि "बच्चों" जैसी अनियमित संज्ञाओं से मदद नहीं मिलती है, लेकिन यह वैसे भी एक बहुत बड़ा सुधार है।

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

Jharrison.au के उत्तर से उद्धृत, इसे बदलें:

if ($like) {
                $likeCond = '(' . join(' OR ', $like) . ')';
            }

इसके लिए:

if ($like) {
                $likeCond = '(' . join(' AND ', $like) . ')';
            }

अपने खोज परिणामों की प्रासंगिकता को तत्काल, बड़े पैमाने पर बढ़ावा देने के लिए।

बहुवचन के लिए, आप इस तरह से एक शब्द के अंतिम "s" को काट सकते हैं:

$words = Mage::helper('core/string')->splitWords($queryText, true, $query->getMaxQueryWords());
$words = array_walk($words,function(&$value, &$key) { 
    // use substr(...) instead of rtrim($value,'s') 
    // because rtrim will remove multiple esses
    $value = (substr($value,-1,1) === 's') ? substr($value,0,strlen($value - 1)) : $value;
});
foreach ($words as $word) {
       $like[] = $helper->getCILike('s.data_index', $word, array('position' => 'start')); // note I changed this to 'start'
}

में app/code/local/Mage/Core/Model/Resource/Helper/Abstract.phpआप कोर फ़ाइल को ओवरराइड और बदल सकते हैं public function escapeLikeValue($value, $options = array())एक त्वरित शॉर्टकट के रूप में है, हालांकि सलाह दी रास्ता एक मॉड्यूल में एक ही बात करना है। लेकिन यहाँ यह है।

के तहत if (isset($options['position'])) {एक स्विच है। मैंने मूल्य के पहले और बाद में रिक्त स्थान जोड़ने के लिए 'शुरू' और 'अंत' के लिए मामलों को बदल दिया:

 case 'start':
      $value = '% ' . $value . '%'; // added '% ' . before
      // $value = $value . '%'; // core way (bad way)
      break;
 case 'end':
      $value = '%' . $value . ' %'; // added . ' %' after
      // $value = '%' . $value; // core way (bad way)
      break;

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

Jharrison.au के उत्तर से एक परीक्षा ले रहा है, जहां एक डिफ़ॉल्ट खोज इंडेक्स फ़ील्ड इस तरह दिखेगा:

EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|

मेरा इस तरह दिखेगा:

 EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable | 

(प्रत्येक "पहले |" और "/" और पहले स्थान पर पहले शब्द से पहले रिक्त स्थान नोट करें)


1
आपने ओवरराइड करने का उल्लेख किया है app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php। यह फ़ाइल खोज की कार्यक्षमता के अलावा कहीं और उपयोग नहीं की जाती है?
अमृतश्री

1
@amitshree अच्छा सवाल। मैं अपने सिर के ऊपर से नहीं जानता। इसका उपयोग किसी भी मॉडल संसाधन द्वारा खोज परिणामों के लिए किया जा सकता है, मुझे लगता है। लेकिन यह विशेष रूप LIKEसे एसक्यूएल खोज प्रश्नों में भागने के लिए है , और मैगेंटो खोज और उत्पाद खोज सूचकांक में और कहां है? मैंने 2 साल पहले एक प्रोडक्शन साइट में यह बदलाव किया था और हमें इससे संबंधित कोई बग नहीं मिला। यह सब वास्तव में करता है, ताकि एक "शब्द की शुरुआत" से पहले एक स्थान होना चाहिए, और "शब्द का अंत" के बाद एक स्थान होना चाहिए। सूचकांक में अलग-अलग, मैं यह सुनिश्चित करता हूं कि हर शब्द के चारों ओर रिक्त स्थान हो।
ब्यूटिक बटुक 21

2

उपरोक्त में से कोई भी, ब्लास्ट ल्यूसिन सर्च या एक्सटेंडवेयर ल्यूसिन सर्च की तरह कुछ स्थापित करके बिल्ट-इन ज़ेड ल्यूसिन सर्च इंजन का उपयोग न करें। प्रासंगिकता किसी भी MySQL प्रसाद की धड़कन है।

हाँ, मैं स्वीकृत उत्तर पर सभी पुनरावृत्तियों से गुज़रा, लेकिन स्पष्ट रूप से, ऑप्टिमाइज़्ड स्टॉक मैगनेटो खोज में अभी भी बहुत कमी थी।

दूसरी ओर ल्यूसीन, पहले से ही मैगेंटो इंस्टॉल में शामिल है, वितरित करता है और इसे सक्षम करने के लिए इसे एक मॉड्यूल की जरूरत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.