विभिन्न खोज प्रकारों के बीच अंतर क्या है?
- पसंद
- पूर्ण पाठ
- संयुक्त
मुझे विशेष रूप से दिलचस्पी है कि उन सेटिंग्स के लिए खोज व्यवहार और प्रदर्शन कैसे बदलता है।
विभिन्न खोज प्रकारों के बीच अंतर क्या है?
मुझे विशेष रूप से दिलचस्पी है कि उन सेटिंग्स के लिए खोज व्यवहार और प्रदर्शन कैसे बदलता है।
जवाबों:
हर कोई हमेशा 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 परिणाम जोड़ता है।
आप संयोजन विधि का उपयोग करके अंक 5 और 6 के आसपास काम कर सकते हैं - LIKE परिणाम किसी भी ऐसे शब्द की भरपाई करनी चाहिए जिसे FULLTEXT ने अनदेखा किया हो।
"लाइक" सर्च सामान्य मैच की तरह ही होगा, जैसे '% कीवर्ड%' क्वेरी का उपयोग करते हुए। इस प्रकार की खोज का एक फायदा यह है कि यह आंशिक शब्दों से मेल खाएगी। हालांकि इसमें गंभीर कमियां हैं:
फुलटेक्स्ट सर्च MyISAM फुलटेक्स्ट सर्च ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ) का उपयोग करके काम करेगा । आपको इसके बारे में पढ़ना चाहिए, लेकिन संक्षेप में:
फुलटेक्स्ट का दोष यह है कि यह आंशिक मिलान नहीं कर सकता है, अर्थात "फो" की खोज में "फोन" नहीं मिलेगा।
"संयुक्त" खोज परिणामों का मिलान करने के लिए "जैसी" स्थिति का उपयोग करेगी, लेकिन उन्हें छांटने के लिए पूर्ण खोज स्कोर पर भी ध्यान देगी। इसका मतलब है कि आपको अधिक परिणाम मिलेंगे (जैसे कि खोज आंशिक मैच भी करेगी) और फुलटेक्स स्कोर के कारण उन्हें बेहतर ऑर्डर भी दिया जाएगा।
जैसा कि अन्य लोगों ने कहा, यदि आप खोज के बारे में गंभीर हैं तो आपको सोल्र का उपयोग करना चाहिए। यह तेजी से रास्ता है और बहुत अधिक प्रासंगिक है। आपको Magento EE का मालिक होना चाहिए और अपने आप को Solr स्थापित करना होगा।
वे मैगेंटो के प्रकार का उपयोग करने के लिए प्रत्यक्ष संदर्भ हैं। व्यक्तिगत रूप से मुझे लगता है कि पूर्ण पाठ खोज अधिक शक्तिशाली है और प्रदर्शन बेहतर है, खासकर अगर 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
ORकरने के लिए AND?
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 |
(प्रत्येक "पहले |" और "/" और पहले स्थान पर पहले शब्द से पहले रिक्त स्थान नोट करें)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php। यह फ़ाइल खोज की कार्यक्षमता के अलावा कहीं और उपयोग नहीं की जाती है?
LIKEसे एसक्यूएल खोज प्रश्नों में भागने के लिए है , और मैगेंटो खोज और उत्पाद खोज सूचकांक में और कहां है? मैंने 2 साल पहले एक प्रोडक्शन साइट में यह बदलाव किया था और हमें इससे संबंधित कोई बग नहीं मिला। यह सब वास्तव में करता है, ताकि एक "शब्द की शुरुआत" से पहले एक स्थान होना चाहिए, और "शब्द का अंत" के बाद एक स्थान होना चाहिए। सूचकांक में अलग-अलग, मैं यह सुनिश्चित करता हूं कि हर शब्द के चारों ओर रिक्त स्थान हो।
उपरोक्त में से कोई भी, ब्लास्ट ल्यूसिन सर्च या एक्सटेंडवेयर ल्यूसिन सर्च की तरह कुछ स्थापित करके बिल्ट-इन ज़ेड ल्यूसिन सर्च इंजन का उपयोग न करें। प्रासंगिकता किसी भी MySQL प्रसाद की धड़कन है।
हाँ, मैं स्वीकृत उत्तर पर सभी पुनरावृत्तियों से गुज़रा, लेकिन स्पष्ट रूप से, ऑप्टिमाइज़्ड स्टॉक मैगनेटो खोज में अभी भी बहुत कमी थी।
दूसरी ओर ल्यूसीन, पहले से ही मैगेंटो इंस्टॉल में शामिल है, वितरित करता है और इसे सक्षम करने के लिए इसे एक मॉड्यूल की जरूरत है।