我有一个简单的搜索功能,可以在表格中搜索匹配。基本上这个搜索的一个缺陷就是它试图完全匹配字符串。我希望它采取一串说“大红鸟”并分别搜索“大”,“红”和“鸟”对着桌子。这是我的搜索查询...
$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 :(得分:2)
全文搜索确实会有所帮助,因为您确实需要搜索大量数据。可以在此处找到全文的良好参考:http://forge.mysql.com/w/images/c/c5/Fulltext.pdf
我说很多数据或相当数量的原因是,如果搜索结果产生的返回行数超过一定百分比的总行数,则不会返回任何数据。
如果您想继续使用LIKE
方法,则可以。你只需要分开单词(explode
)并使用AND将它们连接到sql查询中:
...(tags LIKE '%$search_ar[0]%' AND tags LIKE '%$search_ar[1]%') OR ....
以这样的方式。这种方法可能会变得过于复杂,特别是如果你想要返回包含任何单词而不是所有单词的匹配项。所以,它需要做一些自定义和自动化,但它是可能的。
答案 1 :(得分: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。