我的mvc模型中有一个过滤器,它从搜索字段中获取变量。除其他外,它会搜索标题,但搜索结果很差。这可能是一个简单的语法问题,但我看不到它在搜索。
我有一些项目标题,如:
“Manolo Blahnik Carolyne金色亮片露背浅口鞋(35.5,金色)” 要么 “Belstaff Trialmaster Jacket”
目前,如果您搜索“manolo blahnik shoes”或“belstaff jacket”,您将无法获得任何结果。如何才能获得该字符串任何部分的任何字词的匹配?
我尝试将%添加到变量的任意一侧,例如%'。$ keyword。'%但是这不起作用。
//Filtering search field
$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.' )');
}
答案 0 :(得分:0)
我认为你最好的选择是爆炸你得到的搜索刺激并从中创建OR来
所以
$keyword = "manolo blahnik shoes";
$keyWords = explode(' ', $keyword);
$ors = array();
foreach($keywords as $word) {
$word = $db->Quote('%' . $db->escape($word, true) . '%');
$ors[] = "a.title LIKE %word";
$ors[] = "a.features LIKE $word";
$ors[] = "a.title brand LIKE $word"
}
$queryString = implode(' OR ', $ors');
$query->where($queryString);
由于只有一个单词应该只在3列中的一列中,因此您可以拥有一整行OR。
当然,这可能会成为一个相当大的查询,所以也许这是你必须记住的事情。
此代码也是一个例子,您可以根据需要进行更改,例如确保在爆炸之前$ keywords不为空,转义您获得的关键字或使用预准备语句来防止sql注入此类内容。< / p>
对于类似这样的事情,甚至可能明智地考虑使用solr进行搜索,而不是直接使用mysql进行搜索。或者如果你有一个myisam表,你可以查看全文搜索mysql FULLTEXT search multiple words