【发布时间】:2012-04-04 03:09:53
【问题描述】:
我正在为一个小型网站构建一个简单的搜索引擎。用户将能够通过email address 或name 搜索他们的朋友。我希望使用 FULLTEXT 搜索,但我使用的是 InnoDB 表,所以这让我回到了LIKE %keyword%。
我的问题是用户的名字和姓氏存储在两个单独的列中。我怎么能去搜索“大卫规则”是这样的情况?
这是我目前拥有的:
if(filter_var($query,FILTER_VALIDATE_EMAIL)) {
$STH = $this->_db->prepare("SELECT UserID
FROM UserCredTable
WHERE EmailAddress = :query;");
} else {
$STH = $this->_db->prepare("SELECT UserID
FROM UserInfoTable
WHERE FirstName LIKE :query
OR LastName LIKE :query;");
}
它有点工作,但我猜相关性几乎不存在:(
如何按最相关的结果排序?
更新:
这看起来是一个不错的解决方案吗?
if(filter_var($query,FILTER_VALIDATE_EMAIL)) {
$params["query"] = $query;
$STH = $this->_db->prepare("SELECT UserID
FROM UserCredentials
WHERE EmailAddress = :query;");
} else {
$params["query"] = "%".$query."%";
$STH = $this->_db->prepare("SELECT UserID
FROM UserDetails
WHERE CONCAT(FirstName,' ',LastName)
LIKE :query;");
}
【问题讨论】:
-
这不是从性能的角度来看。此查询将无法使用索引,因此,对于大型表和/或大量使用,它会使服务器变慢。不过对于小桌子来说还可以。
-
@YourCommonSense 搜索的行数不会超过六千行。而且很少见。这可以接受吗?
-
“很少”表示每天最多 50 次。
-
是的,总的来说应该没问题。
-
我知道这已经过时了,但对于未来的读者来说,值得一提的是,从 MySQL 5.6 开始,InnoDB 也支持 FULLTEXT 索引。
标签: php mysql search full-text-search pdo