ORM中的搜索策略
时间:2020-03-05 18:42:01 来源:igfitidea点击:
我正在寻找有关在不同ORM中处理搜索的信息。
目前,我正在用PHP重新开发一些旧的应用程序,其中一项要求是:使所有内容或者几乎所有内容都可搜索,因此用户只需键入" punkrock live",该应用程序便会找到视频剪辑,音乐曲目,评论,即将发生的事件甚至带有标签的用户评论。道路。
在所有内容都可搜索的环境中,ORM需要以两种方式支持此功能:
- 在ORM的" O"侧提供一些索引API
- 提供在" R"侧进行批量数据库检索的方法
理想的解决方案是根据搜索到的字符串返回现成的对象。
我们是否知道有什么行之有效的端到端解决方案,而不一定是PHP?
如果我们处理类似的问题,最好听听经验。 ;;)*之外,还有使用Lucene或者语义网的更多功能
解决方案
回答
我最近将Compass搜索引擎集成到了Java EE 5应用程序中。它基于Lucene Java,并支持不同的ORM框架以及其他类型的模型,例如XML或者完全没有实际模型;)
对于由ORM框架管理的对象模型,我们可以使用特殊注释(例如,@Searchable)为类添加注释,注册类,并让Compass在应用程序启动时为它们建立索引,并自动侦听对模型的更改。
在搜索方面,我们将拥有Lucene的强大功能。然后,指南针为我们提供模型对象的实例作为搜索结果。
它不是PHP,但是我们说它不一定非要PHP;)不知道这是否有帮助,不过...
回答
在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; } }