我正在尝试为MySQL InnoDB创建基本搜索功能。我知道有全文搜索,但我现在只想制作一个简单易用的解决方案。我想要的是,当用户搜索“宝马汽车”时,我想找到的结果不仅仅是“宝马汽车”而且还有“汽车宝马”“宝马Z4汽车”等等。有简单的方法吗?这个?你会如何实现这样的搜索?
现在我正在使用LIKE:
SELECT title,id FROM table WHERE title LIKE '%BMW Car%'
但这不会给我带来像“宝马汽车宝马”“宝马Z4汽车”的结果......
答案 0 :(得分:1)
您可以使用两个LIKE:
SELECT title,id FROM table WHERE title LIKE '%BMW%' AND title LIKE '%Car%'
如果没有必要将服务器的配置从4更改为reduce the minimum key word size以匹配BMW
,我会说你最好使用full-text search boolean mode从一开始。它更加灵活:
SELECT title,id FROM table WHERE MATCH (title)
AGAINST ('+BMW +Car -Volvo' IN BOOLEAN MODE);
全文搜索还可以搜索短语:
SELECT title,id FROM table WHERE MATCH (title)
AGAINST ('+"BMW Z4" -"BMW Z3"' IN BOOLEAN MODE);
答案 1 :(得分:0)
查看MySQL中的逻辑运算符:http://dev.mysql.com/doc/refman/5.1/en/logical-operators.html
# Title must contain either "bmw" or "car"
SELECT title, id FROM table WHERE title LIKE '%bmw%' OR title LIKE '%car%'
#Title must contain both "bmw" and "car"
SELECT title, id FROM table WHERE title LIKE '%bmw%' AND title LIKE '%car%'
答案 2 :(得分:0)
这将需要一些预处理来将用户输入分成单词。在php中,你可以这样做:
$sql = "SELECT title,id FROM table WHERE " ;
$or = "" ;
$inputs = explode(" ", $_GET['q']) ;
foreach($inputs as $input) {
if(trim($input)=="") continue ;
$sql .= $or."title LIKE '%".sprintf("%s", mysql_real_escape_string($input))."%' " ;
$or = "OR " ;
}
$result = mysql_query($sql) ;
答案 3 :(得分:0)
你应该考虑使用Lucene这样的搜索功能。它的整个存在围绕着搜索文档。您将获得一个文档ID(代表您的表PK),然后使用它选择数据库。