2014-05-08 41 views
0

我在我的mvc模型中有一個過濾器,它從搜索字段獲取一個變量。它搜索標題等等,但搜索結果很差。這可能是一個簡單的語法問題,但我看不到它搜索。使用通配符改進mysql搜索結果。 Joomla 3.3

我有一些項目名稱,如:

「莫羅·伯拉尼克Carolyne金色亮粉的露跟泵(35.5,黃金)」 或 「貝達弗Trialmaster夾克」

目前,如果你搜索「的Manolo Blahnik的鞋「或」belstaff夾克「,你不會得到任何結果。我如何在字符串的任何部分匹配任何單詞?

我已經嘗試在變量的任一側添加%,比如%'。$ 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

你期望什麼?標題是否應包含所有單詞或至少一個單詞。例如,你的manolo例子在搜索中有鞋子,但有manolo和blahnik。還有,它必須讓所有的單詞都符合單詞的順序嗎? – melvin

+0

沒有順序無關緊要,它應該匹配字符串中至少有一個單詞的地方。 – larpo

回答

0

我覺得你最好的選擇是,然後爆你得到的搜索刺痛,創建或從他們的

所以

$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。

當然這可能會成爲一個相當大的查詢,所以也許這是你必須記住的東西。

此代碼也是一個例子,您可以根據自己的需求進行更改,例如確保$關鍵字在爆炸之前不是空的,轉義您獲取的關鍵字或使用準備好的語句來防止SQL注入這樣的事情。

對於這樣的事情來說,尋找solr進行搜索可能更明智,而不是直接用mysql來做。或者如果你有一個myisam表,你可以看看全文搜索mysql FULLTEXT search multiple words