PHP - 从数据库返回最接近的匹配

时间:2011-07-08 09:17:33

标签: php mysql match closest

我正在根据用户代理返回手机数据。但是在没有存储useragent的情况下(更新版本的手机或软件),我希望能够返回最接近的匹配,有点像谷歌显示“你的意思是这个”。即。

如果我有

的存储用户
  

Mozilla / 5.0(Linux; U; Android   2.1- UPDATE1; EN-NL; Desire_A8181 Build / ERE27)AppleWebKit / 530.17   (KHTML,像Gecko一样)Version / 4.0 Mobile   Safari浏览器/ 530.17

并且正在使用的用户代理是

  

Mozilla / 5.0(Linux; U; Android   2.1- UPDATE1; EN-NL; Desire_G45H Build / ERE27)AppleWebKit / 530.17   (KHTML,像Gecko一样)Version / 4.0 Mobile   Safari浏览器/ 530.17

我希望能够返回存储的内容,以相应地添加或调整我的数据。

有谁知道实现这一目标的方法?

5 个答案:

答案 0 :(得分:4)

使用大多数相关数据进行全文搜索......

SELECT * MATCH(browser) AGAINST ('your browser') AS score order by score DESC

答案 1 :(得分:2)

模糊字符串匹配的常用方法是计算levenshtein距离或将其实现为n-gram搜索索引。但是对于匹配用户代理,这是过度的。

而是将您搜索的字符串减少到某些重要标准,然后执行类似

的操作
SELECT * FROM agents WHERE agent LIKE "Mozilla/5.0 (Linux; U; Android%) AppleWebKit/5% Version/4.0 Mobile Safari/5%"

因此,您删除了某些过于详细的部分,并在LIKE语句中用%替换它们。但是,您应该重新考虑架构 - 我只会保存重要部分并省略确切的内部版本号等。另外考虑使用已包含用户代理的外部库并为您进行匹配,无需重新发明轮子。

编辑:就像VolkerK上面指出的那样,“外部图书馆”应该是PHPs getbrowser。刚刚添加了答案的完整性; - )

答案 2 :(得分:0)

查看Highlight the difference between two strings in PHP上的其中一个脚本,通过一些修改,您应该可以获得一定比例的差异。

答案 3 :(得分:0)

使用full-text search;否则这些功能可能有所帮助:

答案 4 :(得分:0)

为了获得最佳结果,您可以提取整个记录并循环猜测谁是最相似的单词

检查这些功能

SIMILAR_TEXT

SOUNDEX

LEVENSHTEIN

$most_similar = "";
$highestPercentage = 0;
foreach ($ua in $all_user_agents) {
    $i = similar_text($current_user_agent, $ua, &$p);
    if ($p > $highestPercentage) {
        $highestPercentage = $p;
        $most_similar = $ua;
    }
}

echo "most similar = $most_similar"

无论如何,您可以按照this one

等指南使用mySQL全文搜索