ORM中的搜索策略
问题描述:
我在查找有关在不同的ORM中处理搜索的信息。ORM中的搜索策略
目前我正在重新开发PHP中的一些旧应用程序,其中一个要求是:使所有或几乎所有内容都可搜索,因此用户只需输入“punkrock live”,应用程序即可找到视频剪辑,音乐曲目,评论,即将发生的事件,甚至用户评论标记为这种方式。
在环境中的一切是搜索的ORM需要支持此功能的方法有两种:
- 提供的ORM
- 提供大容量数据库检索手段的“R”的“O”侧一些索引API边
理想的解决方案将基于搜索的字符串返回现成的对象。 您是否知道任何可以完成这项工作的良好端到端解决方案,而不一定是使用PHP? 如果你处理类似的问题,那么听听你的经验是好的。东西比使用Lucene的或语义网更是一路 oneliners,寿; - )*
答
我最近整合了Compass搜索引擎到Java EE 5应用程序。它基于Lucene Java,支持不同的ORM框架以及其他类型的模型,如XML或根本没有真正的模型;)
在由ORM框架管理的对象模型的情况下,您可以使用特殊注释(例如@Searchable),注册您的类并让Compass在应用程序启动时对其进行索引,并自动侦听对模型的更改。
说到搜索,你有Lucene的力量在手。指南针然后为您提供模型对象的实例作为搜索结果。
这不是PHP,但是你说没有是PHP必然;)不知道这是否会有所帮助,但...
答
在行走1.3 Schema.xml文件,你可以指定您希望所有模型都能扩展您创建的“BaseModel”类。
在这种BaseModel,你要重新定义保存()方法是这样的:
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;
}
}