2013-08-30 187 views
1

目前我正在嘗試爲我的網站創建一個搜索功能,以便用戶使用全名(第一個或最後一個)或用戶名搜索其他用戶。現在我創建了一個臨時搜索,它使用mysql的LIKE功能和%name%來允許通配符。它非常簡單。我遇到的問題是在提供全名時嘗試搜索名稱,並且只有名稱的縮寫版本在數據庫中。例如:php mysql搜索引擎

搜索理查德只會拿出理查茲而不是裏奇。我非常難以確定如何創建能夠做到這一點的東西,而不是非常低效。我打算使用SOUNDEX,但這隻對英文名字和單詞有用。

另外我想問一下,如果使用像Apaches Lucene這樣的搜索引擎來索引數據庫是否更好?我正在考慮這一點,但不知道這是否值得,因爲搜索引擎只會搜索小型全文字符串。

謝謝

+2

嘗試使用'levensthein'過濾器http://stackoverflow.com/questions/4671378/levenshtein-mysql-php – elclanrs

+0

看來這是一個最好的方式去,但它是最好的方法來使用大型數據庫?一旦信息被放回到數據庫中,我正在搜索它將成爲超過一百萬用戶的庫存。 – tiantang

回答

0

使用Approximate string matching對結果進行排名,並在給定閾值內顯示所有結果。

您可以從評論中提到的levenshtein開始,並返回最低分數。 Levenshtein計算差異,所以低分表示高度相似性。 0分表示完全匹配。

+0

如何在MySQL中安裝levenshtein? –

-2

您可以通過以下嘗試:

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/>'; 
    } 

?> 
+0

這基本上是我除了使用PDO以外什麼都沒有。但是,如果我輸入完整的名稱,它不會提供縮寫名稱。 IE Richard => Richard,Rich => Richard,Rich – tiantang

0

如果他們把你的名字全名,你首先必須根據空格分隔與PHP爆炸的名稱。
然後你必須取第一個名字並根據你想要的字符分割它。例如。 如果你有安東尼奧,分裂爲4個字符給安託。
然後你做你的搜索功能。

以下是如何拆分爲4個字符:
$ str =「Antonia」;
$ arr2 = str_split($ str,4);
echo $ arr2 [0];