在MySql中进行简单搜索

时间:2010-10-03 08:33:13

标签: mysql select search innodb sql-like

我正在尝试为MySQL InnoDB创建基本搜索功能。我知道有全文搜索,但我现在只想制作一个简单易用的解决方案。我想要的是,当用户搜索“宝马汽车”时,我想找到的结果不仅仅是“宝马汽车”而且还有“汽车宝马”“宝马Z4汽车”等等。有简单的方法吗?这个?你会如何实现这样的搜索?

现在我正在使用LIKE:

SELECT title,id FROM table WHERE title LIKE '%BMW Car%'

但这不会给我带来像“宝马汽车宝马”“宝马Z4汽车”的结果......

4 个答案:

答案 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),然后使用它选择数据库。