使用通配符改进mysql搜索结果。 Joomla 3.3

时间:2014-05-08 19:00:41

标签: php mysql

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

1 个答案:

答案 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