我正在寻找有关在不同ORM中处理搜索的信息。
目前我正在重新开发PHP中的一些旧应用程序,其中一个要求是:使所有内容或几乎所有内容都可搜索,因此用户只需键入“punkrock live”,该应用程序即可查找视频剪辑,音乐曲目,评论,即将发生的事件甚至是用户用这种方式标记的评论。
在一切都可以搜索的环境中,ORM需要以两种方式支持此功能:
理想的解决方案将根据搜索到的字符串返回现成的对象。 您是否知道有任何良好的端到端解决方案可以完成这项工作,而不一定是PHP? 如果您处理类似的问题,那么倾听您的体验是很好的。除了使用Lucene 或语义网之外的其他方式 oneliners,tho; - )*
答案 0 :(得分:2)
我最近将Compass搜索引擎集成到了Java EE 5应用程序中。它基于Lucene Java,支持不同的ORM框架以及其他类型的模型,如XML或根本没有实际模型;)
对于由ORM框架管理的对象模型,您可以使用特殊注释(例如@Searchable)注释您的类,注册您的类并让Compass在应用程序启动时对它们进行索引并自动监听模型的更改。 / p>
在搜索方面,你拥有Lucene的力量。然后,Compass会将模型对象的实例作为搜索结果。
这不是PHP,但你说它不一定是PHP必须;)不知道这是否有帮助,但是......
答案 1 :(得分:1)
在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;
}
}