1

我正在寻找有关在不同 ORM 中处理搜索的信息。

目前我正在用 PHP 重新开发一些旧应用程序,其中一个要求是:使所有内容或几乎所有内容都可搜索,因此用户只需键入“punkrock live”,该应用程序就会找到视频剪辑、音乐曲目、评论、即将发生的事件,甚至标记为的用户评论方式。

在一切都可搜索的环境中,ORM 需要以两种方式支持此功能:

  • 在 ORM 的“O”端提供一些索引 API
  • 为“R”端的批量数据库检索提供手段

理想的解决方案将根据搜索到的字符串返回现成的对象。你知道有什么好的端到端解决方案可以完成这项工作,不一定是 PHP 吗?如果你处理过类似的问题,很高兴听听你的经历。不仅仅是使用 Lucene语义网是oneliners 的方式,但 ;-)*

4

2 回答 2

2

我最近将Compass搜索引擎集成到 Java EE 5 应用程序中。它基于Lucene Java,支持不同的 ORM 框架以及其他类型的模型,如 XML 或根本没有真正的模型;)

对于由 ORM 框架管理的对象模型,您可以使用特殊注释(例如 @Searchable)来注释您的类,注册您的类并让 Compass 在应用程序启动时为它们编制索引,并自动监听模型的更改。

在搜索方面,您可以使用 Lucene 的强大功能。Compass 然后为您提供模型对象的实例作为搜索结果。

它不是 PHP,但你说它不一定是 PHP ;) 不知道这是否有帮助,虽然......

于 2008-08-22T16:05:16.197 回答
1

在 Propel 1.3 schema.xml 文件中,您可以指定您希望所有模型都扩展您创建的“BaseModel”类。

在该 BaseModel 中,您将重新定义 save() 方法,如下所示:

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

    return parent::save($conn);
}

这负责将所有内容都编入索引。至于搜索,我建议使用一些方法创建一个 Search 类。

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;
   }
}
于 2008-11-19T18:26:50.023 回答