2008-08-22 118 views
1

我在查找有關在不同的ORM中處理搜索的信息。ORM中的搜索策略

目前我正在重新開發PHP中的一些舊應用程序,其中一個要求是:使所有或幾乎所有內容都可搜索,因此用戶只需輸入「punkrock live」,應用程序即可找到視頻剪輯,音樂曲目,評論,即將發生的事件,甚至用戶評論標記爲這種方式。

在環境中的一切是搜索的ORM需要支持此功能的方法有兩種:

  • 提供的ORM
  • 提供大容量數據庫檢索手段的「R」的「O」側一些索引API邊

理想的解決方案將基於搜索的字符串返回現成的對象。 您是否知道任何可以完成這項工作的良好端到端解決方案,而不一定是使用PHP? 如果你處理類似的問題,那麼聽聽你的經驗是好的。東西比使用Lucene的語義網更是一路 oneliners,壽; - )*

回答

2

我最近整合了Compass搜索引擎到Java EE 5應用程序。它基於Lucene Java,支持不同的ORM框架以及其他類型的模型,如XML或根本沒有真正的模型;)

在由ORM框架管理的對象模型的情況下,您可以使用特殊註釋(例如@Searchable),註冊您的類並讓Compass在應用程序啓動時對其進行索引,並自動偵聽對模型的更改。

說到搜索,你有Lucene的力量在手。指南針然後爲您提供模型對象的實例作爲搜索結果。

這不是PHP,但是你說沒有是PHP必然;)不知道這是否會有所幫助,但...

1

在行走1.3 Schema.xml文件,你可以指定您希望所有模型都能擴展您創建的「BaseModel」類。

在這種BaseModel,你要重新定義保存()方法是這樣的:

public function save(PropelPDO $con = null) 
{ 
    if($this->getIsSearchable()) 
    { 
      // update your search index here. Lucene, Sphinx, or otherwise 
    } 

    return parent::save($conn); 
} 

這需要的藏在心裏索引服務。至於搜索,我建議用幾種方法創建一個搜索類。

class Search 
{ 
    protected $_searchableTypes = array('music','video','blog'); 

    public method findAll($search_term) 
    { 
     $results = array(); 

     foreach($this->_searchableTypes as $type) 
     { 
     $results[] = $this->findType($type, $search_term); 
     } 

     return $results; 
    } 
}