我有一个像这样的结构的数据库:
用户表
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将首先显示,因为此条目是首先找到的条目。
问题: 如何在不丢失匹配的情况下搜索所有字段并保留相关性顺序?
答案 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 强>
解决方法强>
您可以使用查询扩展来搜索更短的关键字,或使用MATCH()AGAINST()IN BOOLEAN MODE。这允许您添加星号(*)以将字符串填充到有效长度。
更多关于FULLTEXT搜索的内容:http://www.mysqltutorial.org/mysql-full-text-search.aspxmysql