2012-02-13 8 views
0

私はこのコードをまとめてDBにmysqlテーブルを検索しました。それはうまく動作しますが、ユーザーが入力するのとまったく同じ単語に一致するように制限されています。誰もがそれを作る方法を知っているので、それは私の何らかの関連性にマッチしますか?私は全文検索について読んできましたが、本当にそれを把握しているようです。どうすればLIKEの代わりに全文検索を行うことができますか?

たとえば、2つのフィールドで「未回答の質問」を検索すると、検索した単語が表示されている文字列にそのような結果が表示され、関連性、そのような(検索結果の出力例): - 未回答の質問 は - 回答質問 - - 未回答の質問 - 未回答の質問 - 質問 - 答え

$k = trim ($_GET['search']); 
    $i = ""; 
    $terms = explode (" ", $k); 
    $query = "SELECT * FROM table1 WHERE "; 

    foreach ($terms as $each){ 
    $i++; 

    if ($i == 1) 
    $query .= "fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%'  "; 

    else 
    $query .= "OR fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%' "; 
    } 

    // connect 
    include_once "connect.php"; //connect 2 db 
    $query = mysql_query($query); 
    $numrows = mysql_num_rows ($query); 
    if ($numrows > 0){ 

     while ($row = mysql_fetch_assoc ($query)){ 

    // 
    // 
    // echo out something here 
    // 
    // 

    } 

    }else 
     { 
     echo "No results found for <b>$k</b>"; 
    } 

答えて

0

は、全文検索、あなたを行うに が質問に答えする必要があります:

あなたのケースでは、テーブル内の全文インデックス(フィールドはBLOBすることはできません注意してください)

ALTER TABLE tablename ADD FULLTEXT(field1, field2,...); 

を作成します:PHPの変更

$k = trim ($_GET['search']); 
    $i = ""; 
    $terms = explode (" ", $k); 
    $query = "SELECT * FROM table1 WHERE "; 

    foreach ($terms as $each){ 
    $i++; 

    if ($i == 1) 
    $query .= "fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%'  "; 

    else 
    $query .= "OR fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%' "; 
    } 

ALTER TABLE table1 ADD FULLTEXT(fld_title, fld_keyword); 

$k = trim ($_GET['search']); 
$query="SELECT * FROM table1 WHERE MATCH(fld_title, fld_keyword) AGAINST ('".$k."')"; 

あなたは結果の関連性を確認したい場合は:マッチングに応じて、マッチしない、または他の場合は0:

$query="SELECT *, MATCH(fld_title, fld_keyword) AGAINST ('".$k."') as relevancy FROM table1 WHERE MATCH(fld_title, fld_keyword) AGAINST ('".$k."')"; 

MATCH-AGAINSTは数を返します。

あなたが "関連性によって順序"、メイクのためのクエリを変更するより関連性の高い検索... MATCH(fld_title、fld_keyword)AGAINSTすることができます( ' "$ kを。"')> 0.5

つだけ問題:AGAINSTの部分(あなたのための$ k)は3文字以上でなければなりません。

関連する問題