2008-09-30 195 views

回答

21

是的,最有效的方式通常是在數據庫中搜索。要做到這一點,你有三種選擇:

  • LIKE, ILIKE精確匹配子
  • RLIKE匹配POSIX正則表達式
  • FULLTEXT索引,以匹配另一個三種不同類型的搜索的目的是自然語言處理

所以這取決於你將要實際尋找什麼來決定什麼是最好的。對於書名,我會提供一個LIKE搜索確切的子字符串匹配,當人們知道他們正在查找的書以及FULLTEXT搜索以幫助找到類似單詞或短語的標題時非常有用。我當然會在界面上給他們不同的名字,可能類似於子字符串搜索和類似的全文搜索。

約全文一個例子:http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

+0

斯芬克斯會爲此工作嗎? – 2016-03-05 18:09:02

10

這裏有一個簡單的方法,你可以掰開一些關鍵字建立一些條款對這些關鍵字過濾列,無論是AND或OR在一起。

$terms=explode(',', $_GET['keywords']); 
$clauses=array(); 
foreach($terms as $term) 
{ 
    //remove any chars you don't want to be searching - adjust to suit 
    //your requirements 
    $clean=trim(preg_replace('/[^a-z0-9]/i', '', $term)); 
    if (!empty($clean)) 
    { 
     //note use of mysql_escape_string - while not strictly required 
     //in this example due to the preg_replace earlier, it's good 
     //practice to sanitize your DB inputs in case you modify that 
     //filter... 
     $clauses[]="title like '%".mysql_escape_string($clean)."%'"; 
    } 
} 

if (!empty($clauses)) 
{ 
    //concatenate the clauses together with AND or OR, depending on 
    //your requirements 
    $filter='('.implode(' AND ', $clauses).')'; 

    //build and execute the required SQL 
    $sql="select * from foo where $filter"; 
} 
else 
{ 
    //no search term, do something else, find everything? 
} 
1

Paul Dixon的代碼示例爲基於LIKE的方法獲得了良好的主要思想。 (AND | OR)單選按鈕在界面中設置,默認爲AND,那麼如果用戶的查詢結果爲零(0)匹配且包含至少兩個單詞,有一個選項,效果作出迴應:

「對不起,沒有匹配被發現的搜索短語展開搜索,以匹配任何單詞這句話在你

也許有一個更好的辦法?去說這個,但是基本的想法是引導這個人走向另一個查詢(可能會成功),用戶不必用AND和OR的布爾邏輯思考。

2

考慮使用sphinx。這是一個開源的全文引擎,可以直接使用你的mysql數據庫。它比手工編寫的LIKE語句更具可擴展性和靈活性(並且對SQL注入的影響要小得多)

1

我認爲如果是單詞,Like就是最有效的方法。正如已經說過的那樣,多個單詞可能會與爆炸函數分開。然後它可以循環並用於通過數據庫單獨搜索。如果返回兩次相同的結果,可以通過將值讀入數組來檢查。如果它已經存在於數組中,則忽略它。然後通過計數功能,您可以知道在循環打印時停止的位置。可以用similar_text函數來完成排序。百分比用於對數組進行排序。這是最好的。

相關問題