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 中的搜索策略的主要内容,如果未能解决你的问题,请参考以下文章