it-swarm-id.com

Cara yang tepat untuk menggunakan pencarian teks lengkap MySQL pada string kata kunci?

Saya memiliki string kata kunci yang ingin saya lakukan pencarian teks lengkap.

Permintaan pencarian saat ini dalam model adalah sebagai berikut:

$jinput = JFactory::getApplication()->input;
    $keyword = $jinput->get('keyword', '', 'NULL');
    if($keyword!=''){
         $keyword = $db->Quote('%' . $db->escape($keyword, true) . '%');
            $query->where('( a.title LIKE '.$keyword.'  OR  a.features LIKE '.$keyword.'  OR  a.brand LIKE '.$keyword.' )');
    }

Namun ini mengembalikan hasil pencarian yang sangat buruk. Misalnya, string pencarian Google Nexus 5 cocok, sedangkan Google 5 Nexus tidak. Apa cara yang benar untuk mengonversi kueri ini menjadi penelusuran teks lengkap di Joomla 3.3

3
user2097091

NB. ini bukan kode yang diuji hanya diketik di browser sehingga peringatan emptor

Langkah pertama adalah memeriksa istilah pencarian untuk spasi dan kemudian explode() itu menjadi array() yang berisi setiap string yang dibatasi ruang. misalnya.

$keywordArray = explode(" ", $keyword);

Jika Anda ingin saja menemukan konten yang memiliki semua kata kunci di dalamnya, maka Anda juga perlu menggunakan AND daripada OR. Omong-omong, panggilan $db->quote() Anda secara otomatis melakukan escape() cara Anda menggunakannya (saya tidak yakin apakah ia mendeteksi teks yang sebelumnya diloloskan dengan pelolosan ekstra atau tidak dalam kasus Anda).

Jadi, untuk membangun where, Anda dapat mengulangi array dengan sesuatu seperti:

if($keyword!=''){
    $keywordArray = explode(" ", $keyword);

    foreach ($keywordArray as $keyword)
    {
        $searchTerm = $db->Quote('%' . $keyword . '%');
        $query->where('( a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' AND a.title LIKE '.$searchTerm.' )');
        $query->where('( a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' AND a.features LIKE '.$searchTerm.' )');
        $query->where('( a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' AND a.brand LIKE '.$searchTerm.' )');
    }
}

Karena itu, ini bisa menjadi beban serius pada MySQL, ini adalah database relasional bukan mesin pencari. Anda mungkin ingin melakukan hal-hal seperti:

  1. Berikan opsi pada pengguna untuk mencari di salah satu kolom saja
  2. Batasi jumlah kata pada input, bayangkan pencarian dengan 10 kata atau lebih di dalamnya.
  3. Lihatlah opsi-opsi seperti MATCH dan MATCH AGAINST
1
Craig

Saya menghadapi masalah yang sama terutama ketika Anda memiliki kumpulan data besar. Saya mencoba juga solusi MATCH dan MATCH AGAINST tetapi tidak terlalu membantu untuk pencarian teks lengkap. Pada akhirnya saya menulis sendiri plugin Finder dan melakukan migrasi ekstensi saya untuk pencarian teks lengkap untuk menggunakan pencarian pintar . Tidak tahu apakah ini pilihan untuk Anda.

1
Laoneo