【发布时间】:2012-07-10 19:23:45
【问题描述】:
我的任务是通过数据库查找内容,即使在搜索时拼写错误,所以我使用 strcmp 来比较查询中的 soundex。我当前的代码有问题。如果我搜索 AZUS,我的意思是 ASUS,并且有一个带有 ASUS 的标题,它不会出现。那是因为在post_entry ASUS 是<a href="">ASUS </a> 所以我必须在下面的代码中执行soundex("%'.$arraytagsd.'") 取出% 来执行此操作但是对于每个选项 %s% 或 %s 或 s% 或 s 会让我的脚本变慢。
还有没有比使用 soundex 更快的方法?
我创建了这个函数来获取搜索输入的每个单词并将其与数据库进行比较
$colname_getPosts = $_GET['post_title'];
mysql_select_db($database_Main);
function test($string) {
$output = '';
$arrays = explode(' ', $string);
foreach ($arrays as $arraytagsd) {
$output .= ' OR strcmp(soundex(post_title), soundex("%'.$arraytagsd.'%")) = 0';
$output .= ' OR strcmp(soundex(post_entry), soundex("%'.$arraytagsd.'%")) = 0';
$output .= ' OR strcmp(soundex(tags), soundex("%'.$arraytagsd.'%")) = 0';
$output .= ' OR strcmp(soundex(post_author), soundex("%'.$arraytagsd.'%")) = 0';
}
return $output;
}
我在按相关性排序的查询中使用它
$query_getPosts = "
SELECT post_id, post_date, post_title, post_author, post_entry, tags, sum(relevance)
FROM (
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 10 AS relevance FROM blog_posts WHERE MATCH(post_title) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 2 AS relevance FROM blog_posts WHERE MATCH(post_author) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)".test($colname_getPosts)."
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 5 AS relevance FROM blog_posts WHERE MATCH(post_entry) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)
UNION
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 7 AS relevance FROM blog_posts WHERE MATCH(tags) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE))results
GROUP BY post_id, post_date, post_title, post_author, post_entry, tags ORDER BY relevance DESC";
$getPosts = mysql_query($query_getPosts) or die(mysql_error());
$row_getPosts = mysql_fetch_assoc($getPosts);
$totalRows_getPosts = mysql_num_rows($getPosts);
?>
【问题讨论】:
-
澄清:我必须做 "%'.$arraytagsd.'%";然后是 "'.$arraytagsd.'%" 然后是 "%'.$arraytagsd.'" 然后是 "'.$arraytagsd.'" 这会减慢脚本速度
-
"%'.$arraytagsd.'%"将匹配所有 4 个建议的表达式,因为%匹配 0 个或多个字符(如正则表达式中的*),not 1 个或多个字符(如正则表达式中的+) -
...尽管如此,
%在 soundex 的上下文中是否有意义?我在documentation 的任何地方都看不到它... -
soundex 不会产生非常好的搜索结果...
-
idk 但是当我使用上面的代码时它不起作用。我还决定采用您之前的答案,因为它看起来更整洁。你应该发布一个答案
标签: php mysql database soundex