2012-07-10 114 views
1

我有任务通过数据库查找内容,即使它在搜索时被拼写错误,所以我正在使用strcmp比较查询中的soundex。问题与我目前的代码。如果我搜索AZUS,我的意思是华硕,并且有一个华硕的头衔,它不会显示出来。这是因为在post_entry华硕是<a href="">ASUS </a>所以我将不得不在soundex("%'.$arraytagsd.'")在我的代码下面取出%做到这一点,但是对于每个选项%s%或%s或s%或s会使我的脚本变慢。MySQL查询中的Soundex不能正常工作

有没有办法更快地使用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); 
?> 
+0

澄清:我将不得不做“%'。$ arraytagsd。'%”;然后是''。$ arraytagsd。'%'然后是'%'。$ arraytagsd。'“然后是''。$ arraytagsd。'”这会减慢脚本的速度 – kezi 2012-07-10 19:34:42

+0

'“%'。$ arraytagsd。'%”'会匹配所有4,因为'%'匹配0个或更多字符(像正则表达式中的*),**不是** 1个或更多字符(像正则表达式中的+) – DaveRandom 2012-07-10 19:46:00

+0

......虽然说过,无论如何,'%'在soundex的上下文中是否有意义?我无法在[documentation](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex)中的任何地方看到它...... – DaveRandom 2012-07-10 19:50:06

回答

0

你或许应该考虑使用solr为此,但如果你想在MySQL中做到这一点,这是我会做的。

  1. 对于正在进行此搜索的列,请创建单独的soundex列。像:product_name,product_name_soundex。
  2. 要填充product_name_soundex,你需要在代码中做一堆东西:a)检索产品名称,b)标记名称,c)为每个标记计算soundex(但考虑使用双重metaphone) d)将结果字符串存储在product_name_soundex中。这可能看起来像product_name:Tonka Toy Truck product_name_soundex:T2242 T592 T2321。
  3. 在product_name上创建一个全文索引,在product_name_soundex上创建一个索引。
  4. 写下你这样的话,你可以像使用相同的标记和soundex algothrithms一样构建_soundex列。