MySQL搜索多个字段并对结果进行排序

时间:2014-03-11 11:18:37

标签: php mysql

我有一个像这样的结构的数据库:

用户表

ID |  firstname  | lastname   | email
________________________________________________
 1 |  Carl       | Andersson  | carl@site.se
 2 |  Carl       | Smith      | smith@site.se
 3 |  Eve        | Carlow     | carlow@site.se
 4 |  Randy      | Smith      | randy@site.se

我需要一个搜索功能,允许我搜索所有字段。 我尝试过使用像

这样的语句
$query = "SELECT * FROM users WHERE firstname LIKE '%" . $KEYWORD . "%' OR lastname LIKE '%" . $KEYWORD . "%' OR email LIKE '%" . $KEYWORD . "%'"; 

以上作品,但结果列表未根据相关性正确排序。

示例1

如果用户搜索" Carl Andersson"因为名字和姓氏存储在不同的字段中,所以不会匹配。

我也试过像这样使用REGEXP:

$KEYWORD = str_replace (" ", "|", $KEYWORD); 
$query = "SELECT * FROM users WHERE firstname REGEXP '%" . $KEYWORD . "%' OR lastname REGEXP '%" . $KEYWORD . "%' OR email REGEXP '%" . $KEYWORD . "%'";

示例2

如果用户搜索" Carl Smith"用户1,2,3都会显示出来。但相关性顺序将是错误的。 ID 1将首先显示,因为此条目是首先找到的条目。

问题: 如何在不丢失匹配的情况下搜索所有字段并保留相关性顺序?

1 个答案:

答案 0 :(得分:0)

我使用mysql全文索引匹配解决了这个问题。

第1步: 将全文索引添加到相关字段

ALTER TABLE  users  
ADD FULLTEXT(firstname, lastname, email);

第2步: 使用MATCH()AGAINST()

进行搜索
$query = "SELECT productName, productline FROM products WHERE MATCH(firstname, lastname, email) AGAINST('Carl Smith')";

此方法根据相关性自动对匹配进行排序。

<强> Pittfalls

  1. 要使这个方法起作用,你的表需要是myISAM类型,不是 InnoDB
  2. 搜索查询的长度必须至少为4个字符 不会返回任何匹配。
  3. 解决方法

    您可以使用查询扩展来搜索更短的关键字,或使用MATCH()AGAINST()IN BOOLEAN MODE。这允许您添加星号(*)以将字符串填充到有效长度。

    更多关于FULLTEXT搜索的内容:http://www.mysqltutorial.org/mysql-full-text-search.aspxmysql