การค้นหาประเภทต่างกันแตกต่างกันอย่างไร
- ชอบ
- ข้อความเต็ม
- รวม
ฉันสนใจเป็นพิเศษว่าพฤติกรรมการค้นหาและการเปลี่ยนแปลงประสิทธิภาพสำหรับการตั้งค่าเหล่านั้นเป็นอย่างไร
การค้นหาประเภทต่างกันแตกต่างกันอย่างไร
ฉันสนใจเป็นพิเศษว่าพฤติกรรมการค้นหาและการเปลี่ยนแปลงประสิทธิภาพสำหรับการตั้งค่าเหล่านั้นเป็นอย่างไร
คำตอบ:
ทุกคนมักจะบ่นเกี่ยวกับการค้นหา 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 ... กับคำค้นหา คุณสามารถเห็นสิ่งนี้ในการดำเนินการในMage_CatalogSearch_Model_Resource_Helper_Mysql4
บรรทัดที่ 44:
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;
}
ตารางฐานข้อมูลวีโอไอพีใช้เมื่อการดำเนินการค้นหา Fulltext catalogsearch_fulltext
คือ ค่าตัวอย่าง:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
ค่าเหล่านี้จะเชื่อมโยงโดยตรงกับแอตทริบิวต์ที่คุณระบุเป็น 'ใช้ในการค้นหาอย่างรวดเร็ว' ภายใต้แคตตาล็อก> คุณสมบัติ> จัดการคุณสมบัติ
สวยด้วยตนเองอธิบาย ดูที่บรรทัด 354 ของMage_CatalogSearch_Model_Resource_Fulltext :
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;
}
คุณสามารถดูได้เพียงเพิ่มผลลัพธ์ LIKE หลังจากผลลัพธ์ FULLTEXT กลับมา
คุณสามารถหลีกเลี่ยงคะแนน 5 & 6 ได้โดยใช้วิธีการรวม - ผลลัพธ์ LIKE ควรชดเชยกับคำใด ๆ ที่ FULLTEXT ข้ามไป
การค้นหา "ชอบ" จะทำการจับคู่เหมือนปกติโดยใช้คำค้นหา '% คำหลัก%' ข้อดีอย่างหนึ่งของการค้นหาประเภทนี้คือมันจะจับคู่คำบางส่วน มันมีข้อเสียอย่างร้ายแรงแม้ว่า:
การค้นหา Fulltext จะทำงานโดยใช้ MyISAM fulltext search ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ) คุณควรอ่านเกี่ยวกับเรื่องนี้ แต่สรุป:
ข้อเสียเปรียบของ fulltext คือมันไม่สามารถทำการจับคู่บางส่วนได้เช่นการค้นหา "pho" จะไม่พบ "phone"
การค้นหา "รวม" จะใช้เงื่อนไข "ชอบ" เพื่อจับคู่ผลลัพธ์ แต่จะพิจารณาคะแนนการค้นหาแบบเต็มสำหรับการเรียงลำดับ ซึ่งหมายความว่าคุณจะได้รับผลลัพธ์มากขึ้น (เช่นเดียวกับการค้นหาจะทำการจับคู่บางส่วนด้วย) และพวกเขาจะได้รับคำสั่งที่ดีขึ้นเนื่องจากคะแนนเต็ม
อย่างที่คนอื่นพูดถ้าคุณจริงจังกับการค้นหาคุณควรใช้ Solr มันเร็วกว่าและมีความเกี่ยวข้องมากกว่า คุณจะต้องมี Magento EE และติดตั้ง Solr ด้วยตัวเอง
พวกเขากำลังอ้างอิงโดยตรงกับประเภทของแบบสอบถามที่วีโอไอพีจะใช้ โดยส่วนตัวแล้วฉันคิดว่าการค้นหาข้อความแบบเต็มนั้นมีประสิทธิภาพมากกว่าและประสิทธิภาพก็ดีกว่าโดยเฉพาะถ้าใช้ LIKE กับไวด์การ์ด (%) การรวมกันของทั้งสองอาจจะถูกต้องที่สุด แต่อาจเกิน ฉันจะติดกับข้อความแบบเต็ม
แต่ถ้าคุณกำลังมองหาวิธีการแก้ปัญหาการตรวจสอบการค้นหาที่มีประสิทธิภาพจากโครงการนี้: https://code.google.com/p/magento-solr/ SOLR ถูกสร้างขึ้นเพื่อค้นหาคอลเลกชันขนาดใหญ่และในขณะที่อาจต้องใช้เวลาสักครู่ในการปรับใช้มันควรจะคุ้มค่า โดยส่วนตัวฉันไม่เคยใช้มันใน Magento มาก่อน แต่ในโครงการ 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%" เป็นค่าเริ่มต้น ฉันได้เปลี่ยนให้ตรงกับ "term%" (สังเกตช่องว่างก่อนคำ) เพื่อให้ตรงกับจุดเริ่มต้นของคำ ฉันยังตัดการค้นหาขั้นสุดท้ายในคำค้นหาเพื่อให้ "รถยนต์" ให้ผลลัพธ์เหมือนกับ "รถยนต์" เห็นได้ชัดว่านั่นไม่ได้ช่วยให้คำนามผิดปกติเช่น "เด็ก ๆ " แต่มันเป็นการปรับปรุงที่มากมาย
การย้ายที่ไร้สาระอย่างลึกลับโดย Magento ที่ใหญ่ที่สุดคือใช้การค้นหา "OR" แทน "AND" หากคุณค้นหา "รถยนต์สีแดง" คุณจะได้รับทุกสิ่งที่เป็นสีแดง (รวมถึงรถยนต์, สุนัข, ส้อม, ภูเขา ฯลฯ ) และรถยนต์ทุกประเภท (รวมถึงสีแดงสีน้ำเงินสีเขียวสีเหลือง ฯลฯ ) ด้วย "และ" คุณจะได้รับเฉพาะรายการที่มี "สีแดง" และ "รถ" ซึ่งเป็นวิธีการค้นหาควรทำงาน!
อ้างจากคำตอบของ 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'])) {
สวิตช์นั้นมี ฉันเปลี่ยนเคสสำหรับ 'start' และ 'end' เพื่อเพิ่มช่องว่างก่อนและหลังค่า:
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;
สำหรับช่องว่างก่อน / หลังการทำงานคุณอาจต้องเปลี่ยนวิธีการสร้างดัชนีการค้นหาเช่นเดียวกับฉันเพื่อให้แน่ใจว่ามีช่องว่างก่อนและหลังทุกคำ วิธีเริ่มต้นในการสร้างดัชนีคือการแยกแต่ละเขตข้อมูลด้วย '|' (ตัวอักษรท่อ) เช่น "สีน้ำเงิน | รถยนต์ | รถที่ดีมาก" สำหรับการจัดทำดัชนีสีประเภทผลิตภัณฑ์รายละเอียดสินค้า แต่ดัชนีของฉันมี "สีน้ำเงิน | รถยนต์ | รถที่ดีมาก" คุณสามารถแก้ไขสิ่งปลูกสร้างของดัชนีการค้นหาเพื่อแทนที่คำที่ใส่ยัติภังค์ ("super-fast car" กลายเป็น "super fast car") เป็นต้นและอื่น ๆ
การยืมตัวอย่างจากคำตอบของ 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
ในเคียวรีการค้นหาของ SQL และวีโอไอพีจะค้นหาอะไรอีก แต่อยู่ในดัชนีการค้นหาผลิตภัณฑ์? ฉันทำการเปลี่ยนแปลงนี้เมื่อ 2 ปีก่อนในไซต์การผลิตและเราไม่พบข้อบกพร่องใด ๆ ที่เกี่ยวข้องกับเรื่องนี้เลย สิ่งที่มันทำจริงๆคือการทำให้ "เริ่มต้นคำ" ต้องมีช่องว่างก่อนหน้าและ "ท้ายคำ" ต้องมีช่องว่างหลังจากนั้น ในดัชนีแยกกันฉันแน่ใจว่าทุกคำมีช่องว่างอยู่รอบ ๆ
ไม่ใช้ทั้งหมดข้างต้นใช้เครื่องมือค้นหา Zend Lucene ในตัวโดยติดตั้งบางอย่างเช่น Blast Lucene Search หรือ Extendeware Lucene Search ความเกี่ยวข้องจะเป็นไปตามข้อเสนอของ MySQL
ใช่ฉันผ่านการวนซ้ำทั้งหมดในคำตอบที่ได้รับการยอมรับ แต่ตรงไปตรงมาการค้นหา Stock Magento ที่มีประสิทธิภาพยังคงไม่เพียงพอ
ในทางกลับกัน Lucene นำเสนอและรวมอยู่ในการติดตั้ง Magento แล้วเพียงแค่ต้องการโมดูลเพื่อเปิดใช้งาน