快速 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/