PHP/MySQL : Highlight "SOUNDS LIKE" query results

标签 php mysql highlighting soundex

快速 MYSQL/PHP 问题。如果使用普通搜索查询没有找到结果,我将使用“不太严格”的搜索查询作为后备,调整为:

foreach($find_array as $word) { 
  clauses[] = "(firstname SOUNDS LIKE '$word%' OR lastname SOUNDS LIKE '$word%')";
}
if (!empty($clauses)) $filter='('.implode(' AND ', $clauses).')';
$query = "SELECT * FROM table WHERE $filter";

现在,我使用 PHP 来突出显示结果,例如:

foreach ($find_array as $term_to_highlight){
    foreach ($result as $key => $result_string){
        $result[$key]=highlight_stuff($result_string, $term_to_highlight);
    }
}

但是当我不知道要突出显示什么时,这种方法就派上用场了。有什么方法可以在运行该 mysql 查询时找出“声音相似”的匹配项吗?

也就是说,如果有人搜索“Joan”,我希望它突出显示“John”。

最佳答案

请注意,SOUNDS LIKE 并不像您想象的那样工作。它不等同于 MySQL 中的 LIKE,因为它不支持 % 通配符。

这意味着您的查询在搜索“John”时不会找到“John David”。如果这只是您的后备方案,这可能是可以接受的,但这并不理想。

所以这里有一个不同的建议(可能需要改进);首先使用 PHPs soundex() 函数来查找您要查找的关键字的 soundex。

$soundex = soundex($word);
$soundexPrefix = substr($soundex, 0, 2); // first two characters of soundex
$sql = "SELECT lastname, firstname ".
    "FROM table WHERE SOUNDEX(lastname) LIKE '$soundexPrefix%' ".
    "OR SOUNDEX(firstname) LIKE '$soundexPrefix%'";

现在您将得到一个名字和姓氏的列表,这些名字和姓氏在发音上具有模糊的相似性(这可能有很多条目,并且您可能想要增加用于搜索的 soundex 前缀的长度)。然后,您可以计算每个词的发音和搜索词之间的 Levenshtein 距离,并以此为依据进行排序。

其次,您应该查看 MySQL 中的参数化查询,以避免 SQL 注入(inject)错误。

关于PHP/MySQL : Highlight "SOUNDS LIKE" query results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1778252/

相关文章:

mysql - 无法更新表

search - 来自脚本的 Vim 搜索和高亮控制

php - 在 CentOS 6.2 上百胜安装

php - 如何在 PHP 中使用 Dom 文档查找 Dom 元素的样式属性?

sql - 将 MySQL 数据库迁移到 Sql Server

即使 'AllowNoPassword' 设置为 true,PhpMyAdmin 仍然显示登录页面

python - Selenium 可以用来突出网页的各个部分吗?

Vim 上下文高亮

php - 仅使用 curl 和 php 获取 http 状态代码

php - 无法从 php 更新 mysql 中的数据