【问题标题】:Search strategies in ORMsORM 中的搜索策略
【发布时间】:2008-08-22 14:05:05
【问题描述】:
我正在寻找有关在不同 ORM 中处理搜索的信息。
目前我正在用 PHP 重新开发一些旧应用程序,其中一个要求是:使所有内容或几乎所有内容都可搜索,因此用户只需键入“punkrock live”,该应用程序就会找到视频剪辑、音乐曲目、评论、即将发生的事件甚至用户cmets 就是这样标记的。
在一切皆可搜索的环境中,ORM 需要通过两种方式来支持这个特性:
- 在 ORM 的“O”端提供一些索引 API
- 为“R”端的批量数据库检索提供方法
理想的解决方案将根据搜索到的字符串返回现成的对象。
你知道有什么好的端到端解决方案可以完成这项工作,不一定是 PHP 吗?
如果你处理过类似的问题,很高兴听听你的经历。除了使用 Lucene 或 语义网之外,还有其他东西 oneliners ;-)*
【问题讨论】:
标签:
search
orm
doctrine
propel
【解决方案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;
}
}