【问题标题】:Soundex in MySQL Query not working correctlyMySQL Query 中的 Soundex 无法正常工作
【发布时间】: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


【解决方案1】:

您可能应该考虑为此使用 solr,但如果您想在 mysql 中执行此操作,我会这样做。

  1. 对于您正在执行此搜索的列,请创建单独的 soundex 列。比如:product_name、product_name_soundex。
  2. 要填充 product_name_soundex,您将不得不在代码中做很多事情:a) 检索产品名称,b) 标记名称,c) 计算每个标记的 soundex(但考虑使用双变音位), d) 将生成的字符串存储在 product_name_soundex 中。这可能类似于 product_name: Tonka Toy Truck product_name_soundex: T2242 T592 T2321。
  3. 在 product_name 上创建全文索引,在 product_name_soundex 上创建一个全文索引。
  4. 编写这样的语句,以便使用与构建 _soundex 列相同的标记化和 soundex 算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2022-11-17
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2017-04-30
    相关资源
    最近更新 更多