2011-12-06 11 views
6

私は、人が自分の名前と興味を追加するmySQLテーブルを持っています。私は100%の一致または近い一致のいずれかを見つけていく何らかの単語マッチを使用したい。私はlevenshteinの距離を聞いたが、私のテーブルを介してそれをサイクルにする方法の手がかりがありません。おそらくLevenshteinの距離を使って検索語の精度を一致させる

$input = $_POST["interest"]; 
    $result = mysql_query("SELECT interest_desc FROM interests"); 

は、いくつかのグーグルを完了し、私はSOUNDEXはあなたのための代替だと思うこの時点まで

function closest($seed, $haystack){ 
    $shortest = -1; 
    foreach ($haystack as $word){ 
     $lev = levenshtein($seed, $word); 
     if ($lev == 0) { 
      $closest = $word; $shortest = 0; break; 
     } 
     if ($lev <= $shortest || $shortest < 0) { 
     $closest = $word; $shortest = $lev; 
     } 
} 
return $closest; 
} 
$array = mysql_fetch_row($result); 
$closestmatch = closest($input,$array); 
echo $closetmatch; 
+0

本当にこれをPHPで実行してもよろしいですか?一致するものを検索したい場合は、DBの最後で正しく処理されるものです。お知らせください。 – rdlowrey

+0

@rdloweryによれば、おそらくMySQLに責任を渡す方が良いでしょう。http://stackoverflow.com/questions/634995/implementation-of-levenshtein-distance-for-mysql-fuzzy-searchとhttp://www.artfulsoftware.com/infotree/queries.php#552解決策のために... – HorusKol

答えて

0

のお手伝いをすることができ、私はこれを行うためにPHPを使用して考えては、MySQLを簡単かつ効率的にこれを行うことができ、間違ったアプローチです。あなたのスキーマ構造全体がどのようなものかは分かりませんが、検索パラメータを使ってPROCEDUREをMySQLに作成し、PHPから呼び出すことができます。

  1. MySQLではこれに似た何かを作る:

    - (p_SearchParam VARCHAR(30))でPROCEDUREのsp_SearchInterestsをCREATE検索パラメータ とPROCを作成します。利益 interest_desc = p_SearchParam OR LIKE '%のpSearchParamの%' //

    END interest_desc FROM //

    SELECT interest_desc DELIMITER。 DELIMITER;

  2. PHPからは、ちょうどCALL sp_SearchInterests('whateveryouwant')の結果が返されます。

+0

簡単かつ効率的ですか?通常は、「ストアドプロシージャを使用する」ことに反対します。なぜなら、それらはMySQLではちょっと悪いからです。また、90%のケースでは、ストアドコードを使用することを意図している場合は、そのコードを_application_に移動する必要があるかどうかを検討する必要があります。最後に、上のコードはLevenshtein distanceとは関係ありません。 –

+0

Fair point Re:Levenshtein distance。彼がやろうとしているのであれば、上記のprocは非常に速く走るだろうが、Levenshteinは不当だと思う。 – Phrancis

関連する問題