ประเภทการค้นหา: กดไลค์, ข้อความแบบเต็มหรือรวมกัน?


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 ... กับคำค้นหา คุณสามารถเห็นสิ่งนี้ในการดำเนินการใน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 กลับมา


สิ่งที่ควรทราบ

  1. ฉันขอแนะนำอย่างยิ่งให้ใช้ FULLTEXT เพื่อประสิทธิภาพที่ดีขึ้นและผลลัพธ์ที่เกี่ยวข้อง
  2. ผ่านแต่ละแอตทริบิวต์และพิจารณาว่าจำเป็นต้องเพิ่มในดัชนี fulltext หรือไม่ ('ใช้ในการค้นหาด่วน')
  3. โดยค่าเริ่มต้นรายละเอียดสินค้าจะรวมอยู่ในการจัดทำดัชนี FULLTEXT ฉันมักจะลบคำอธิบายออกเนื่องจากพวกเขาทำให้คะแนนความเกี่ยวข้องลดลงด้วยคำที่ใช้ในบริบทที่ไม่เกี่ยวข้อง
  4. ตรวจสอบให้แน่ใจว่าแอตทริบิวต์ meta ของคุณถูกใช้ในดัชนี fulltext เติมพวกเขาด้วยเนื้อหาที่มีความหมาย
  5. MySQL FULLTEXT มีนิสัยใจคอบางอย่าง - มันมีรายการคำที่ไม่สนใจซึ่งอาจเป็นปัญหาได้หากชื่อผลิตภัณฑ์ของคุณประกอบด้วยคำเหล่านี้!
  6. MySQL โดยค่าเริ่มต้นละเว้น FULLTEXT แบบสอบถามอายุต่ำกว่า 4 ตัวอักษร แอททริบิวที่มีค่าสั้น ๆ จะถูกละเว้นเว้นแต่คุณจะเปลี่ยนค่านี้

คุณสามารถหลีกเลี่ยงคะแนน 5 & 6 ได้โดยใช้วิธีการรวม - ผลลัพธ์ LIKE ควรชดเชยกับคำใด ๆ ที่ FULLTEXT ข้ามไป


7

การค้นหา "ชอบ" จะทำการจับคู่เหมือนปกติโดยใช้คำค้นหา '% คำหลัก%' ข้อดีอย่างหนึ่งของการค้นหาประเภทนี้คือมันจะจับคู่คำบางส่วน มันมีข้อเสียอย่างร้ายแรงแม้ว่า:

  • จะกลายเป็นปัญหาด้านประสิทธิภาพอย่างรวดเร็ว
  • ความเกี่ยวข้องนั้นไม่ดี ที่จริงแล้วไม่มีแนวคิดเรื่อง "ความเกี่ยวข้อง" ในข้อความค้นหาที่เหมือนกัน

การค้นหา Fulltext จะทำงานโดยใช้ MyISAM fulltext search ( http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ) คุณควรอ่านเกี่ยวกับเรื่องนี้ แต่สรุป:

  • ประสิทธิภาพจะดีกว่า
  • มันจะยกเว้น stopwords (เช่น "และ", "กับ" ฯลฯ )
  • มันจะกำหนดคะแนนตามค่าเริ่มต้นให้กับแต่ละผลลัพธ์ตามความเกี่ยวข้อง

ข้อเสียเปรียบของ fulltext คือมันไม่สามารถทำการจับคู่บางส่วนได้เช่นการค้นหา "pho" จะไม่พบ "phone"

การค้นหา "รวม" จะใช้เงื่อนไข "ชอบ" เพื่อจับคู่ผลลัพธ์ แต่จะพิจารณาคะแนนการค้นหาแบบเต็มสำหรับการเรียงลำดับ ซึ่งหมายความว่าคุณจะได้รับผลลัพธ์มากขึ้น (เช่นเดียวกับการค้นหาจะทำการจับคู่บางส่วนด้วย) และพวกเขาจะได้รับคำสั่งที่ดีขึ้นเนื่องจากคะแนนเต็ม

อย่างที่คนอื่นพูดถ้าคุณจริงจังกับการค้นหาคุณควรใช้ Solr มันเร็วกว่าและมีความเกี่ยวข้องมากกว่า คุณจะต้องมี Magento EE และติดตั้ง Solr ด้วยตัวเอง


1
ขอบคุณสำหรับคำตอบนี้ ทำไมฉันต้องใช้ Magento EE
PiTheNumber

1
การค้นหา Solr เป็นส่วนหนึ่งของ Magento Enterprise (ไม่ใช่คุณสมบัติของชุมชน) มีส่วนขยายที่จะดำเนินการค้นหาในชุมชนเช่นมีmagentocommerce.com/magento-connect/solr-bridge-search.html ฉันไม่ได้ใช้มัน
Paul Grigoruta

6

พวกเขากำลังอ้างอิงโดยตรงกับประเภทของแบบสอบถามที่วีโอไอพีจะใช้ โดยส่วนตัวแล้วฉันคิดว่าการค้นหาข้อความแบบเต็มนั้นมีประสิทธิภาพมากกว่าและประสิทธิภาพก็ดีกว่าโดยเฉพาะถ้าใช้ 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


Fulltext นั้นมีประสิทธิภาพมากกว่า แต่จำเป็นต้องมีการตั้งค่าใน my.cnf ถ้ามันจะให้ผลลัพธ์สำหรับคำที่น้อยกว่า 5 หรือ 4 ตัวอักษรขึ้นอยู่กับการตั้งค่าเริ่มต้น เช่นเดียวกับการค้นหาบ่อยครั้งที่ส่งเสียและจำเป็นต้องเปลี่ยนลอจิกจากหรือเป็นและดังนั้นจึงไม่ได้แสดงผลลัพธ์ที่ไม่เกี่ยวข้องมากเกินไป
Fiasco Labs

คุณพูดถูกเกี่ยวกับข้อความเต็ม มักจะฉลาดที่จะโฮสต์ทั้งใน VPS หรือกับ บริษัท ที่ให้บริการโฮสติ้งวีโอไอพี ตัวเลือกเช่นการกำหนดค่า Fulltext ควรจะมีให้ใช้งานหรืออย่างน้อยคุณสามารถตั้งค่าได้ด้วยตัวเอง คุณมีคำแนะนำการค้นหาของบุคคลที่สาม @Fiasco Labs หรือไม่
Sander Mangel

@FiascoLabs อย่างไรคุณเปลี่ยนORไปAND?
Michael Yaeger

3

ปัญหาของ 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 | 

(ช่องว่างหมายเหตุก่อนและหลังทุก "|" และ "/" และช่องว่างก่อนคำแรก)


1
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.phpคุณได้กล่าวถึงการแทนที่ ไฟล์นี้ไม่ได้ใช้ที่อื่นนอกเหนือจากฟังก์ชั่นการค้นหา?
amitshree

1
@amitshree เป็นคำถามที่ดี ฉันไม่รู้ด้านบนของหัวของฉัน ฉันสามารถใช้โมเดลทรัพยากรเพื่อผลลัพธ์การค้นหาได้ แต่นี่เป็นเรื่องเฉพาะสำหรับการหลบหนีLIKEในเคียวรีการค้นหาของ SQL และวีโอไอพีจะค้นหาอะไรอีก แต่อยู่ในดัชนีการค้นหาผลิตภัณฑ์? ฉันทำการเปลี่ยนแปลงนี้เมื่อ 2 ปีก่อนในไซต์การผลิตและเราไม่พบข้อบกพร่องใด ๆ ที่เกี่ยวข้องกับเรื่องนี้เลย สิ่งที่มันทำจริงๆคือการทำให้ "เริ่มต้นคำ" ต้องมีช่องว่างก่อนหน้าและ "ท้ายคำ" ต้องมีช่องว่างหลังจากนั้น ในดัชนีแยกกันฉันแน่ใจว่าทุกคำมีช่องว่างอยู่รอบ ๆ
Buttle Butkus

2

ไม่ใช้ทั้งหมดข้างต้นใช้เครื่องมือค้นหา Zend Lucene ในตัวโดยติดตั้งบางอย่างเช่น Blast Lucene Search หรือ Extendeware Lucene Search ความเกี่ยวข้องจะเป็นไปตามข้อเสนอของ MySQL

ใช่ฉันผ่านการวนซ้ำทั้งหมดในคำตอบที่ได้รับการยอมรับ แต่ตรงไปตรงมาการค้นหา Stock Magento ที่มีประสิทธิภาพยังคงไม่เพียงพอ

ในทางกลับกัน Lucene นำเสนอและรวมอยู่ในการติดตั้ง Magento แล้วเพียงแค่ต้องการโมดูลเพื่อเปิดใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.