2013-09-23 60 views
0

只是爲了便於理解:在「結果」表中有一列名爲「result_search」的列。其中一行是例如:「單詞字母句子」。搜索結果有限,搜索多個單詞時效果不佳

如果我搜索這些單詞中的任何一個,或者即使搜索「單詞字母」或「字母句子」,但我混淆搜索「句子單詞」或「字母單詞」沒有顯示結果。

我該如何解決這個問題?我會假設我需要告訴搜索引擎自己搜索每個單詞,並且只返回兩個單詞都存在的結果,但是像表格中的單詞一樣,必然會彼此相鄰? 這是我有:

<form action="search.php" method="GET"> 
    <input type="text" name="query" /> 
    <input type="submit" value="Search" /> 
</form> 


<?php 
    $query = $_GET['query'];   
    $min_length = 3;   
    if(strlen($query) >= $min_length){ 

     $query = htmlspecialchars($query);    
     $query = mysql_real_escape_string($query); 

     $raw_results = mysql_query("SELECT * FROM result WHERE (`result_search` LIKE '%".$query."%')") or die(mysql_error());    

     if(mysql_num_rows($raw_results) > 0){ 

      while($results = mysql_fetch_array($raw_results)){     
       echo "<p><h3>".$results['result_search']."</h3></p>"; 
      } 

     } 
     else{ 
      echo "No results"; 
     } 

    } 
    else{ 
     echo "Minimum length is ".$min_length; 
    } 
?> 

謝謝你的幫助!

+0

你可以按空格分割你的關鍵字,然後搜索所有可能的單詞或使用或 –

+0

選項的好概述... http://www.slideshare.net/billkarwin/practical-full-text-search-with -my-sql – barryhunter

+0

請熟悉LIKE運算符的工作原理... – CBroe

回答

1
$raw_results = mysql_query("SELECT * FROM result WHERE (`result_search` REGEXP '(".preg_replace('/\s+/', '|', $query).")')") or die(mysql_error()); 

preg_replace('/\s+/', '|', $query)代替空格與|OR條件來搜索每一個字。

結果查詢將

SELECT * FROM result WHERE (`result_search` REGEXP '(word|letter)') 

查詢結果將包含「字」或每racord「好」

獲取包含兩個字符串正則表達式的記錄不能因爲使用「使用(?=.*用於AND條件重複的操作員的操作數無效」錯誤

$sql = "SELECT * FROM result WHERE 1"; 
$matches = preg_split('/\s+/',$query); 
foreach($matches as $match){ 
$sql .= " AND `result_search` LIKE '%".$match."%'"; 
} 
$raw_results = mysql_query($sql) or die(mysql_error()); 

$matches = preg_split('/\s+/',$query);分裂WHE重新找到空間。

+0

您能否提供解釋,而不是隻發佈一行代碼?特別是在使用正則表達式時,這並不是很簡單。 – nijansen

+0

對不起,我編輯了答案 –

+0

謝謝,現在是一個非常好的答案;) – nijansen