it-swarm-tr.com

Bir anahtar kelime dizesinde MySQL tam metin aramasını kullanmanın doğru yolu?

Tam metin arama yapmak istediğim bir anahtar kelime dizesi var.

Modeldeki geçerli arama sorgusu aşağıdaki gibidir:

$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.' )');
    }

Ancak bu çok zayıf arama sonuçları döndürür. Örneğin, Google Nexus 5 eşleşirken, Google 5 Nexus değil. Bu sorguyu Joomla 3.3'te tam metin aramaya dönüştürmenin doğru yolu nedir?

3
user2097091

Not. Bu sadece tarayıcıya yazılan test kodu değildir, bu yüzden uyarı emptor

İlk adım, arama terimini boşluklar için kontrol etmek ve daha sonra explode() bunu boşlukla sınırlandırılmış dizelerin her birini içeren bir array() haline getirmek olacaktır. Örneğin.

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

Yalnızca içinde tüm anahtar kelimeler içeren içerik bulmak istiyorsanız, aynı zamanda bir AND yerine OR. Bu arada, $db->quote() çağrısı otomatik olarak bir escape() kullandığınız şekilde otomatik olarak gerçekleştirir (daha önce kaçan metni fazladan kaçan ile tespit edip etmediğinden emin değilim veya sizin durumunuzda değil).

Bu nedenle, where 'larınızı oluşturmak için diziye aşağıdaki gibi bir şey ekleyebilirsiniz:

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.' )');
    }
}

Bunu söyledikten sonra, bu MySQL üzerinde ciddi bir yük olabilir, sonuçta bir arama motoru değil ilişkisel bir veritabanı. Bunun gibi şeyler yapmak isteyebilirsiniz:

  1. Kullanıcıya bu sütunlardan yalnızca birinde arama yapma seçeneği verin
  2. Girişteki kelime sayısını sınırlayın, içinde 10 veya daha fazla kelime olan bir arama düşünün.
  3. MATCH ve MATCH AGAINST Gibi seçeneklere bakın
1
Craig

Özellikle büyük veri kümeleriniz olduğunda da aynı sorunla karşılaşıyorum. Ayrıca MATCH ve MATCH AGAINST çözümlerini de denedim ancak tam metin araması için gerçekten yararlı olmadılar. Sonunda kendi Finder eklentisi yazdım ve tam metin araması kullanmak için uzantılarımı taşıyorum akıllı arama . Bunun sizin için bir seçenek olup olmadığını bilmiyorum.

1
Laoneo