代码之家  ›  专栏  ›  技术社区  ›  Michał Niedźwiedzki

ORM中的搜索策略

  •  1
  • Michał Niedźwiedzki  · 技术社区  · 16 年前

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

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

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

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

    理想的解决方案是基于搜索字符串返回现成的对象。 你知道有什么好的端到端解决方案可以完成这项工作吗,不一定是在PHP中? 如果你处理类似的问题,最好听听你的经验。不仅仅是 使用Lucene 语义网就是这样 一行符,tho;-)*

    2 回复  |  直到 10 年前
        1
  •  2
  •   Martin Klinke    16 年前

    我最近整合了 Compass 搜索引擎进入Java EE 5的应用程序。它是建立在 Lucene Java 并且支持不同的ORM框架以及其他类型的模型,比如XML或者根本没有真正的模型;)

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

    说到搜索,你就掌握了露西的力量。然后,Compass将模型对象的实例作为搜索结果提供给您。

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

        2
  •  1
  •   lo_fye    15 年前

    在推进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);
    }
    

    它负责保持所有的索引。至于搜索,我建议用几种方法创建一个搜索类。

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