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

目前我正在用 PHP 重新开发一些旧应用程序,要求之一是:使所有或几乎所有内容都可搜索,因此用户只需输入“punkrock live”,应用程序就会找到以这种方式标记的视频剪辑、音乐曲目、评论、即将举行的活动甚至用户评论。

在所有内容均可搜索的环境中,ORM 需要通过两种方式支持此功能:

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

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

有帮助吗?

解决方案

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

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

当谈到搜索时,您可以利用 Lucene 的强大功能。然后,Compass 会为您提供模型对象的实例作为搜索结果。

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

其他提示

在 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;
   }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top