2012-02-13 16 views
0

經過一番研究,我把這段代碼放在一起來搜索db中的mysql表。雖然它工作正常,但它會限制自己與用戶輸入的內容完全匹配。任何人都知道如何使它符合我的某種相關性?我一直在閱讀關於全文搜索的內容,但我似乎無法真正瞭解它。我該如何改變這個做全文搜索而不是LIKE?

例如,如果您在兩個字段中搜索「未回答的問題」,我希望能夠得到類似結果,包括搜索到的任何字符串中顯示的字詞,並按照相關性,像這樣(搜索結果示例輸出): - 懸而未決的問題 - 回答問題 - 答題 - 懸而未決的問題 - 懸而未決的問題 - 問題 - 答案

$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,...); 

ALTER TABLE table1 ADD FULLTEXT(fld_title, fld_keyword); 
在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%' "; 
    } 

$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(fld_title,fld_keyword)對查詢( ' 「$ k」。請')> 0.5

只有一個問題:反對部分($ k for you)必須大於3個字符。