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?
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:
MATCH
ve MATCH AGAINST
Gibi seçeneklere bakınÖ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.