【问题标题】:php mysql search enginephp mysql 搜索引擎
【发布时间】:2013-09-03 17:50:58
【问题描述】:

目前我正在尝试为我的网站创建一个搜索功能,允许用户使用他们的全名(名字或姓氏)或他们的用户名搜索其他用户。现在我创建了一个临时搜索,它使用 mysql 的 LIKE 功能和 %name% 以允许使用通配符。它非常简单。我遇到的问题是在提供全名并且数据库中只有名称的缩短版本时尝试搜索名称。例如:

搜索 Richard 只会找到 Richards 而不会找到 Richs。对于如何创建能够做到这一点而又不会非常低效的东西,我真的很难过。我打算使用 SOUNDEX,但这只对英文名称和单词有用。

我还想问一下,使用像 Apaches Lucene 这样的搜索引擎来索引数据库是否更好?我正在考虑这样做,但不确定是否值得,因为搜索引擎只会搜索小的全文字符串。

谢谢

【问题讨论】:

标签: php mysql search lucene


【解决方案1】:

使用Approximate string matching 对结果进行排名,并显示给定阈值内的所有结果。

您可以从 cmets 中提到的levenshtein 开始,并返回最低分数。 Levenshtein 计算差异,因此低分意味着高相似度。 0 分表示完全匹配。

【讨论】:

  • 如何在 mysql 中安装 levenshtein?
【解决方案2】:

如果他们输入全名,您首先必须用 PHP 根据空格分隔名称。
然后你必须取名字并根据你想要的字符数来分割它。例如。 如果你有 Antonio,分成 4 个字符给 Anto。
然后你做你的搜索功能。

以下是拆分为 4 个字符的方法:
$str = "安东尼娅";
$arr2 = str_split($str, 4);
回声 $arr2[0];

【讨论】:

    【解决方案3】:

    您可以尝试以下方法:

    search.html

    <html>
        <head>
            <title>Search the Database</title>
        </head>
    
        <body>
    
        <form action="/test/search.php" method="post">
         Search: <input type="text" name="term" /><br />
        <input type="submit" name="submit" value="Submit" />
        </form>
    
        </body>
     </html>
    

    search.php

    <?php
    mysql_connect ("localhost", "username","password")  or die (mysql_error());
    mysql_select_db ("database");
    
    $term = $_POST['term'];
    
    $sql = mysql_query("select * from database where XXXXXX like '%$term%'");
    
    while ($row = mysql_fetch_array($sql)){
        echo 'ID: '.$row['XXXXX'];
        echo '<br/> First Name: '.$row['XXXX'];
        echo '<br/> Last Name: '.$row['XXXX'];
        echo '<br/> Phone: '.$row['XXXX'];
        echo '<br/><br/>';
        }
    
    ?>
    

    【讨论】:

    • 这基本上就是我所拥有的,除了使用 PDO 和什么没有。但是,如果我输入全名,它就不会出现缩写名称。 IE Richard => Richard , Rich => Richard, Rich
    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多