2011-05-29 36 views
0

我想在CMS airpapr中實現一個新的搜索功能。 Airpapr使用PDO連接到數據庫。我應該從頭開始編寫搜索功能嗎,還是有一些很好的開源搜索引擎可以用於PHP/PDO數據庫設置?如果可以自己編寫搜索功能,有沒有關於如何使用PHP/PDO編寫搜索引擎的一些很好的教程?搜索功能本身只需搜索兩個不同的表格行。使用PHP和PDO的CMS搜索功能

+0

它有一個搜索功能,blog.airpapr.com [搜索] – 2011-05-29 20:05:19

+0

是的我知道,但ATM它是一種破碎,只有劑量數據庫搜索文章標題。 – wowpatrick 2011-05-30 18:14:50

回答

3

搜索不僅僅是一個功能;它比簡單的字符串比較+子串出現計數更復雜。

考慮到匹配的術語突出顯示,詞幹分析,同義詞匹配,停用詞的影響以及將搜索索引分開到您的內容數據庫的需求,搜索是現有搜索系統最好解決的一個廣泛問題。

一個流行的選擇是Apache Solr

其主要功能包括強大 全文搜索,命中突出, 面搜索,動態聚類, 數據庫集成,文檔豐富 (例如,文字,PDF )處理和 地理空間搜索。 Solr是高度可伸縮的,提供分佈式搜索 和索引複製,並且它爲 搜索和導航功能 很多世界上最大的互聯網網站 。

有一個Solr library for PHP讓你開始,更不用說整個網絡充滿了與Solr相關的資源。

+0

感謝您的回答,但atm我正在尋找可以在PHP服務器上運行的搜索工具。有什麼可以推薦的PHP搜索工具嗎? – wowpatrick 2011-05-30 18:48:13

0

正如您所說的,您正在使用PDO連接到數據庫,因此使用非供應商特定的SQL命令是一個不錯的主意,因爲PDO的主要功能是可以在不改變噸的情況下使用不同的DBMS每個SQL命令。

要編寫使用PDO的簡單的非供應商特定搜索功能,您可以使用SQL LIKEoperator。一個例子SQL查詢看起來財產以後這樣的:

SELECT column_name(s) 
FROM table_name 
WHERE column_name LIKE pattern 

一定要分開用戶輸入不同的搜索條件和運行要搜索每個詞的搜索。另外,如果您搜索多個列,請務必過濾重複的條目。

另一件需要注意的問題是LIKE運算符所需的%應該被添加到$sth->execute()數據中,而不是在普通的SQL字符串中。欲瞭解更多信息,請參閱此stackoverflow問題。

下面是一個示例腳本一個簡單的搜索功能可以看起來怎麼樣,使用純ANSI SQL:

$searchterm = trim($searchterm); 
    $searchterm = explode(' ', $searchterm); 
    $this->sql = "SELECT ID 
     FROM ".$db_prefix."_base 
     WHERE article_content_title_".$lang." 
     LIKE :string1 
     OR 
     article_content_text_".$lang." 
     LIKE :string2"; 
    foreach ($searchterm as $value) { 
     $this->sth = $dbh_pdo->prepare($this->sql); 
     $this->sth->execute(array(':string1' => "%$value%", ':string2' => "%$value%")); 
     $this->sth->setFetchMode(PDO::FETCH_ASSOC); 
     while ($this->row = $this->sth->fetch()) {  
      $this->id[] = $this->row['ID']; 

     } 
    } 
    $this->id = array_unique($this->id); 
    $this->id = array_merge($this->id); 
    for ($i = 0; $i < count($this->id); $i++) { 
     if ($i == count($this->id) - 1) { 
      $this->searchResultID .= "id = ".$this->id[$i]; 
     } 
     else { 
      $this->searchResultID .= "id = ".$this->id[$i]." OR "; 
     } 
    } 

請注意,這是一個非常基本搜索功能,沒有搜索結果的估值(例如,匹配的詞語突出顯示,詞幹,同義詞匹配等)