2008-08-22 6 views
1

Je cherche des informations sur la gestion de la recherche dans différents ORM. Actuellement, je suis en train de réaménager une ancienne application en PHP et l'une des exigences est: faire tout ou presque tout, donc l'utilisateur tape "punkrock live" et l'application trouve des vidéos clips, des morceaux de musique, des critiques, des événements à venir ou même les commentaires des utilisateurs sont étiquetés de cette façon.Stratégies de recherche dans les ORM

Dans un environnement où tout est ORM interrogeable besoin de soutenir cette fonction de deux façons:

  • fournissant une API d'indexation sur « O » côté de ORM
  • fournissant un moyen pour la récupération de la base de données en vrac sur « R » side

La solution idéale retournerait les objets prêts à l'emploi en fonction de la chaîne recherchée. Connaissez-vous de bonnes solutions de bout en bout qui font l'affaire, pas forcément en PHP? Si vous avez eu un problème similaire, il serait bon d'écouter votre expérience. Quelque chose de plus que Utilisez Lucene ou web sémantique est la façon dont Citations, quoique; -) *

Répondre

2

J'ai récemment intégré le moteur de recherche Compass dans une application Java EE 5. Il est basé sur Lucene Java et prend en charge différents cadres ORM ainsi que d'autres types de modèles comme XML ou aucun modèle réel du tout;)

Dans le cas d'un modèle objet géré par un cadre ORM, vous pouvez annoter vos classes avec spécial annotations (par exemple @Searchable), enregistrez vos classes et laissez Compass les indexer au démarrage de l'application et écouter les modifications apportées automatiquement au modèle.

Quand il s'agit de chercher, vous avez le pouvoir de Lucene à portée de main. Compass vous donne ensuite des instances de vos objets de modèle en tant que résultat de recherche.

Ce n'est pas PHP, mais vous avez dit qu'il n'a pas à être nécessairement PHP;) Je ne sais pas si cela aide, mais ...

1

Dans un fichier schema.xml Propel 1.3, vous pouvez spécifier que vous souhaitez que tous vos modèles étendent une classe "BaseModel" que vous créez.

Dans ce BaseModel, vous allez redéfinir la méthode de sauvegarde() pour être quelque chose comme ceci:

public function save(PropelPDO $con = null) 
{ 
    if($this->getIsSearchable()) 
    { 
      // update your search index here. Lucene, Sphinx, or otherwise 
    } 

    return parent::save($conn); 
} 

qui prend soin de garder tout indexé. En ce qui concerne la recherche, je suggère de créer une classe de recherche avec quelques méthodes.

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; 
    } 
} 
Questions connexes