Jawaban:
Semua orang selalu mengeluh tentang pencarian Magento, tetapi saya percaya ini dapat bekerja dengan sangat baik jika Anda menghabiskan waktu merencanakan dan mengonfigurasinya dengan benar.
Metode pencarian berbasis kata kunci, memecah permintaan Anda menjadi kata-kata individual. Lihat yang berikut dari baris 326 di kelasMage_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) . ')';
}
Anda dapat melihatnya membagi setiap kata dalam permintaan pencarian Anda dan menggabungkannya dalam pernyataan SEPERTI - Anda berakhir dengan sesuatu seperti ini:
WHERE `attribute` LIKE 'my' OR `attribute` LIKE 'search' OR `attribute` LIKE 'query'
Metode ini mungkin berfungsi untuk pengaturan toko tertentu di mana nama produk sederhana dan pelanggan mencari item yang sangat spesifik, tetapi menurut pengalaman saya itu bukan pilihan yang baik.
Pencarian berdasarkan relevansi - setiap permintaan pencarian dinilai sesuai dengan skor yang ditetapkan berdasarkan MATCH MySQL ... LAGI permintaan. Anda dapat melihat ini beraksi di Mage_CatalogSearch_Model_Resource_Helper_Mysql4
baris 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;
}
Tabel database yang digunakan Magento saat melakukan pencarian teks lengkap adalah catalogsearch_fulltext
. Nilai contoh:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Nilai-nilai ini secara langsung ditautkan ke atribut yang Anda tentukan sebagai 'Gunakan dalam Pencarian Cepat' di bawah Katalog> Atribut> Kelola Atribut
Cukup jelas. Lihatlah baris 354 dari 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;
}
Anda dapat melihatnya hanya menambahkan hasil LIKE setelah hasil FULLTEXT kembali.
Anda dapat bekerja di sekitar poin 5 & 6 dengan menggunakan metode Combine - hasil LIKE harus mengimbangi kata-kata yang diabaikan FULLTEXT.
Pencarian "seperti" akan melakukan kecocokan seperti biasa, menggunakan kueri '% kata kunci%' seperti. Satu keuntungan dari jenis pencarian ini adalah ia akan cocok dengan sebagian kata. Ini memiliki kelemahan serius:
Pencarian teks lengkap akan bekerja menggunakan pencarian teks lengkap MyISAM ( http://dev.mysql.com/doc/refman/5.0/id/fulltext-search.html ). Anda harus membacanya, tetapi singkatnya:
Kelemahan dari fulltext adalah tidak dapat melakukan kecocokan sebagian, yaitu pencarian "pho" tidak akan menemukan "telepon"
Pencarian "gabungan" akan menggunakan kondisi "seperti" untuk mencocokkan hasil, tetapi juga akan mempertimbangkan skor pencarian teks lengkap untuk mengurutkannya. Ini berarti Anda akan mendapatkan lebih banyak hasil (seperti pencarian juga akan melakukan kecocokan sebagian) dan mereka juga akan dipesan lebih baik karena skor teks lengkap.
Seperti kata orang lain, jika Anda serius tentang pencarian, Anda harus menggunakan Solr. Ini jauh lebih cepat dan jauh lebih relevan. Anda harus memiliki Magento EE dan menginstal Solr sendiri.
Itu adalah referensi langsung ke jenis permintaan yang akan digunakan Magento. Secara pribadi saya pikir pencarian Teks Lengkap lebih kuat dan kinerja lebih baik, terutama jika LIKE digunakan dengan wildcard (%). Kombinasi keduanya mungkin akan paling akurat tetapi mungkin berlebihan. Saya akan tetap dengan teks lengkap.
Tetapi jika Anda mencari solusi pencarian yang kuat, periksa proyek ini: https://code.google.com/p/magento-solr/ . SOLR dibangun untuk mencari koleksi besar dan walaupun mungkin perlu beberapa waktu untuk mengimplementasikannya, itu layak dilakukan. Secara pribadi saya belum pernah menggunakannya di Magento sebelumnya, tetapi pada proyek PHP lain itu berkinerja sangat baik.
Dokumentasi teks lengkap dapat ditemukan di sini: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html SEPERTI dokumentasi di sini: http://dev.mysql.com/doc/refman/5.0 /en/string-comparison-functions.html
OR
ke AND
?
Masalah dengan LIKE adalah menggunakan "% term%" secara default. Saya telah mengubahnya untuk mencocokkan "term%" (perhatikan spasi sebelum istilah), sehingga cocok dengan awal kata. Saya juga memotong final 'dalam istilah pencarian sehingga "mobil" memberikan hasil yang sama dengan "mobil". Jelas itu tidak membantu dengan kata benda tidak beraturan seperti "anak-anak," tapi itu merupakan kemajuan yang sangat besar.
Langkah terbesar yang tidak masuk akal yang bisa dijelaskan oleh Magento adalah menggunakan pencarian "ATAU" alih-alih "DAN". Jika Anda mencari "mobil merah" Anda akan mendapatkan semuanya merah (termasuk mobil, anjing, garpu, sisi gunung, dll), dan setiap jenis mobil (termasuk merah, biru, hijau, kuning, dll). Dengan "DAN", Anda hanya mendapatkan barang-barang yang mengandung "merah" DAN "mobil", yang adalah bagaimana pencarian harus bekerja!
Mengutip dari jawaban jharrison.au, ubah ini:
if ($like) {
$likeCond = '(' . join(' OR ', $like) . ')';
}
Untuk ini:
if ($like) {
$likeCond = '(' . join(' AND ', $like) . ')';
}
Untuk mendapatkan dorongan langsung dan besar-besaran terhadap relevansi hasil pencarian Anda.
Untuk hal jamak, Anda dapat memotong "s" terakhir dari kata seperti ini:
$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'
}
Di dalam app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
Anda dapat mengganti file inti dan mengubah public function escapeLikeValue($value, $options = array())
sebagai pintasan cepat, meskipun cara yang disarankan adalah melakukan hal yang sama dalam sebuah modul. Tapi ini dia.
Di bawah if (isset($options['position'])) {
ada saklar. Saya mengubah case untuk 'start' dan 'end' untuk menambahkan spasi sebelum dan sesudah nilainya:
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;
Agar spasi sebelum / sesudah bekerja, Anda mungkin juga harus mengubah cara indeks pencarian dibuat, seperti yang saya lakukan, sehingga memastikan ada spasi sebelum dan sesudah setiap kata. Cara default untuk membangun indeks adalah dengan memisahkan setiap bidang dengan '|' (karakter pipa), mis. "biru | mobil | mobil yang sangat bagus" untuk pengindeksan warna, jenis produk, deskripsi produk. Tetapi indeks saya memiliki "biru | mobil | mobil yang sangat bagus". Anda bahkan dapat memodifikasi bangunan indeks pencarian sehingga kata-kata yang ditulis dgn tanda penghubung mungkin diganti ("mobil super cepat" menjadi "mobil super cepat"), dll., Dll.
Meminjam contoh dari jawaban jharrison.au, di mana bidang indeks pencarian default akan terlihat seperti ini:
EmCO0014e|Emma Certified|Emma Certified Organic Herbal Tonic Mist TRIAL/TRAVEL|Australian|Certified Organic|Palm Oil Free|Nut Free|Vegan Suitable|
Milik saya akan terlihat seperti ini:
EmCO0014e | Emma Certified | Emma Certified Organic Herbal Tonic Mist TRIAL / TRAVEL | Australian | Certified Organic | Palm Oil Free | Nut Free | Vegan Suitable |
(perhatikan spasi sebelum dan sesudah setiap "|" dan "/", dan spasi sebelum kata pertama)
app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php
. File ini tidak digunakan di tempat lain selain dari fungsi pencarian?
LIKE
dalam permintaan pencarian SQL, dan di mana lagi Magento mencari tetapi dalam indeks pencarian produk? Saya membuat perubahan ini lebih dari 2 tahun yang lalu di situs produksi dan kami belum menemukan bug yang terkait dengan ini sama sekali. Yang benar-benar dilakukannya adalah membuatnya sehingga "permulaan kata" harus memiliki spasi sebelum itu, dan "akhir kata" harus memiliki spasi sesudahnya. Secara terpisah, dalam indeks, saya memastikan setiap kata memiliki spasi di sekitarnya.
Tidak satu pun di atas, gunakan mesin pencari Zend Lucene bawaan dengan menginstal sesuatu seperti Blast Lucene Search atau Extendeware Lucene Search. Relevansinya mengalahkan semua penawaran MySQL.
Ya, saya telah melewati semua iterasi pada jawaban yang diterima, tetapi terus terang, pencarian Magento Stock yang Dioptimalkan masih sangat kurang.
Lucene di sisi lain, memberikan dan sudah termasuk dalam instalasi Magento, hanya perlu Modul untuk mengaktifkannya.