ORM 中的搜索策略

Posted

技术标签:

【中文标题】ORM 中的搜索策略【英文标题】:Search strategies in ORMs 【发布时间】:2008-08-22 14:05:05 【问题描述】:

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

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

在一切皆可搜索的环境中,ORM 需要通过两种方式来支持这个特性:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

在 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;
   

【讨论】:

以上是关于ORM 中的搜索策略的主要内容,如果未能解决你的问题,请参考以下文章

学说 ORM 和具有抽象类策略的工厂

JMS 反序列化不适用于排除策略

分库分表之后的搜索策略

远程案例中的延迟/急切加载策略(JPA)

使用“AUTO”策略时使用 Doctrine 显式设置 Id

用户搜索策略移动开发