Jenis Pencarian: Suka, Teks Lengkap atau Gabungan?

48

Apa perbedaan antara berbagai jenis pencarian?

  • Suka
  • Teks Lengkap
  • Gabungan

Saya secara khusus tertarik pada bagaimana perilaku pencarian dan kinerja berubah untuk pengaturan itu.

PiNumber
sumber

Jawaban:

63

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.


Suka

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.


Teks lengkap

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_Mysql4baris 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


Menggabungkan

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.


Hal-hal yang perlu diperhatikan

  1. Saya sangat merekomendasikan menggunakan FULLTEXT untuk kinerja yang lebih baik dan hasil yang relevan
  2. Telusuri setiap atribut dan pertimbangkan apakah perlu menambahkannya ke indeks teks lengkap ('Gunakan dalam pencarian cepat')
  3. Secara default deskripsi produk termasuk dalam pengindeksan FULLTEXT. Saya hampir selalu menghapus deskripsi karena mereka mengotori skor relevansi dengan kata-kata yang digunakan dalam konteks yang tidak relevan.
  4. Pastikan atribut meta Anda digunakan dalam indeks teks lengkap. Isi mereka dengan konten yang bermakna.
  5. MySQL FULLTEXT memiliki beberapa keanehan - memiliki daftar kata-kata yang diabaikan yang dapat menjadi masalah jika nama produk Anda terdiri dari kata-kata ini!
  6. MySQL secara default mengabaikan permintaan FULLTEXT di bawah 4 karakter . Atribut dengan nilai pendek akan diabaikan kecuali Anda mengubah nilai ini.

Anda dapat bekerja di sekitar poin 5 & 6 dengan menggunakan metode Combine - hasil LIKE harus mengimbangi kata-kata yang diabaikan FULLTEXT.

jharrison.au
sumber
7

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:

  • akan dengan cepat menjadi masalah kinerja
  • relevansinya buruk. Sebenarnya tidak ada konsep "relevansi" dalam pertanyaan sejenis

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:

  • kinerja lebih baik
  • itu akan mengecualikan stopwords (seperti "dan", "dengan" dll)
  • Ini akan menetapkan skor secara default untuk setiap hasil berdasarkan relevansi

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.

Paul Grigoruta
sumber
1
Terima kasih atas jawaban ini. Mengapa saya membutuhkan Magento EE?
PiTheNumber
1
Pencarian Solr adalah bagian dari Magento Enterprise (bukan fitur komunitas). Ada ekstensi yang akan menerapkan pencarian di komunitas seperti magentocommerce.com/magento-connect/solr-bridge-search.html . Saya tidak menggunakannya.
Paul Grigoruta
6

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

Sander Mangel
sumber
Fulltext lebih kuat, tetapi membutuhkan pengaturan di my.cnf jika itu akan memberikan hasil untuk kata-kata kurang dari 5 atau 4 karakter, tergantung pada pengaturan defaultnya. Seperti pencarian yang sering dikirim rusak dan perlu untuk mengubah logikanya dari OR ke AND sehingga tidak memuntahkan terlalu banyak hasil yang tidak relevan.
Fiasco Labs
Anda benar tentang teks lengkap. Selalu pintar untuk menjadi tuan rumah di VPS atau dengan perusahaan yang menawarkan hosting Magento. Opsi seperti konfigurasi Fulltext harus tersedia saat itu atau setidaknya Anda dapat mengaturnya sendiri. Apakah Anda memiliki saran pencarian pihak ketiga @Fiasco Labs?
Sander Mangel
@ Kegagalan, bagaimana Anda mengubah ORke AND?
Michael Yaeger
3

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.phpAnda 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)

Buttle Butkus
sumber
1
Anda telah menyebutkan untuk mengganti app/code/local/Mage/Core/Model/Resource/Helper/Abstract.php. File ini tidak digunakan di tempat lain selain dari fungsi pencarian?
amitshree
1
@amitshree Pertanyaan bagus. Saya tidak tahu dari atas kepala saya. Itu bisa digunakan oleh sumber daya model apa pun untuk hasil pencarian, saya kira. Tapi ini benar-benar khusus untuk melarikan diri LIKEdalam 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.
Buttle Butkus
2

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.

Laboratorium Fiasco
sumber