【问题标题】:Best way to go about approximate search matching in MySQL/PHP?在 MySQL/PHP 中进行近似搜索匹配的最佳方法?
【发布时间】:2016-08-04 04:37:58
【问题描述】:

我正在寻找一种在 MySQL/PHP 中进行以下搜索的有效方法...

想象一下,我的数据库中有许多要搜索的字段:

User.username
Name.first_name
Address.line1
Phone.number
Email.email_address

我在 PHP 中还有以下变量(带有示例数据)可供搜索:

$username = "john123";
$name = "john";
$address = "10 fake street";
$phone = "23456789";
$email = "john@johnsemail.com";

假设有 0 个完全匹配,我将如何编写一个可以看到部分匹配的查询,然后返回按匹配数排序的结果?

例如,使用我的示例数据,我可能希望看到类似这样的结果,

username | name | address        | phone    | email               | matches
----------------------------------------------------------------------------
john123  | john | 12 new street  | 23456789 | john@johnsemail.com | 4
tim123   | tim  | 10 fake street | 23456789 | tim@timsemail.com   | 2

请注意,我不是在这里寻找通配符搜索。我想返回具有完全匹配的结果,但不一定是使用所有 DB 字段的完全匹配。并且还想根据匹配的数量对结果进行优先级排序。

我可以想到一种非常低效的方法,将每个查询作为单独的查询运行,将其加载到 PHP 数组中,然后计算在最多数组中找到的 ID。但是,运行它的数据库每个表都有数百万条记录,所以这根本不可行。

【问题讨论】:

  • 我在这些场景中使用boolean full-text searches
  • 您可以将字符串分解为字符,并在mysql中使用like语句逐个匹配字符。

标签: php mysql sql query-performance


【解决方案1】:
SELECT *, 
  if (username = '$username', 1, 0) +
  if (name     = '$name'    , 1, 0) +
  if (phone    = '$phone'   , 1, 0) +
  if (address  = '$address' , 1, 0) AS matches
FROM   tab
ORDER BY matches DESC

【讨论】:

  • 谢谢,我一定会试一试的。假设我对查询应用了合理的限制,您是否知道这将如何扩展?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多