2011-05-10 73 views
1

我有一個簡單的搜索功能,可以搜索表格中的某個匹配項。基本上這個搜索的缺點是它試圖完全匹配字符串。我想讓它接一串「大紅色的小鳥」,並在桌子上分別搜索「大」,「紅」和「鳥」。這裏是我的搜索查詢...使用一個字符串搜索多個表字段,並將其拆分(MySQL)

$result = mysql_query("SELECT * FROM files 
     WHERE (tags LIKE '%$search_ar%' OR 
     name LIKE '%$search_ar%' OR 
     company LIKE '%$search_ar%' OR 
     brand LIKE '%$search_ar%') 
     $str_thera $str_global $str_branded $str_medium $str_files"); 

任何想法?謝謝

編輯 確定這裏是我更新的查詢,但它不返回任何東西。

$result = mysql_query("SELECT * FROM files 
      WHERE MATCH(tags, name, company, brand) 
      AGAINST ('$seach_ar' IN boolean MODE)"); 
+0

看看全文搜索。 – 2011-05-10 17:21:38

回答

2

全文搜索確實會有所幫助,因爲您確實有很多數據需要搜索。可以在這裏找到一個很好的全文參考:http://forge.mysql.com/w/images/c/c5/Fulltext.pdf

我說大量數據或相當數量的原因是,如果搜索結果的返回行數超過一定比例返回到總行數,返回。


如果你想繼續使用LIKE方法,你可以。你只需要單獨的單詞(explode)和在SQL查詢中使用,並加入他們:

...(tags LIKE '%$search_ar[0]%' AND tags LIKE '%$search_ar[1]%') OR .... 

在這樣一個時尚。這種方法可能會變得過於複雜,特別是如果說,你想返回包含任何單詞而不是所有單詞的匹配。所以是的,它需要一些定製來做和自動化,但這是可能的。

1

如果出於某種原因無法使用全文搜索(尼克和布拉德,但只有MyISAM支持它,並且從我聽到的信息來看,這並不是那麼好),但這並不難與explode()implode()搭起基本搜索:

$search_arr = explode(' ',$search_str); 
$search_str = implode('%',$search_arr); 
//query where fields like $search_arr 

或者:

$search_arr = explode(' ', $search_str); 
    $sql = 'select * from files where '; 
    foreach($search_arr = $term){ 
    $sql .= "tags like '%{$term}%' or " //fill in rest of fields 
} 

作爲一個方面說明:如果您計劃在越來越多的搜索和不能使用MySQL的全文搜索,我建議檢出其中一個搜索服務器,例如Solr或Lucene。

+0

確定這裏是我更新的查詢,但它不會返回任何東西.... $ result = mysql_query(「SELECT * FROM files WHERE MATCH(tags,name,company,brand)AGAINST('$ seach_ar'in boolean MODE)」); – 2011-05-10 18:57:34

+1

@Greg,如果查詢返回數據庫中多於50%的行,則不會返回任何內容。這就是爲什麼如果你有一個小的數據庫,全文不好。如果您正在進行測試,這也很難,但只需添加一大堆假行來幫助您。 @shauna,是的。這就是我傾向於這樣做的方式。我喜歡我的InnoDB。 – 2011-05-10 19:47:01

+0

@Brad - 讓我們兩個。無論如何,這是怎麼回事?就像他們說的,「如果你想搜索,你不能有關鍵限制,如果你想要限制,你不能搜索。」他們爲什麼不在InnoDB上實現搜索? – Shauna 2011-05-11 13:12:02

相關問題