Question

Je recherche des informations sur la gestion de la recherche dans différents ORM.

Actuellement, je suis en train de redévelopper une ancienne application en PHP et l'une des exigences est la suivante :rendre tout ou presque tout consultable, de sorte que l'utilisateur tape simplement « punkrock live » et l'application trouve des clips vidéo, des morceaux de musique, des critiques, des événements à venir ou même des commentaires d'utilisateurs étiquetés de cette façon.

Dans un environnement où tout est consultable, ORM doit prendre en charge cette fonctionnalité de deux manières :

  • fournir une API d'indexation du côté "O" de l'ORM
  • fournir des moyens de récupération de base de données en masse du côté "R"

La solution idéale renverrait des objets prêts à l’emploi en fonction de la chaîne recherchée.Connaissez-vous de bonnes solutions de bout en bout qui font le travail, pas nécessairement en PHP ?Si vous rencontrez un problème similaire, ce serait bien d'écouter quelle est votre expérience.Quelque chose de plus que Utiliser Lucène ou le web sémantique est la voie à suivre des oneliners, quand même ;-)*

Était-ce utile?

La solution

J'ai récemment intégré le Boussole moteur de recherche dans une application Java EE 5.C'est basé sur Lucène Java et prend en charge différents frameworks 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 framework ORM vous pouvez annoter vos classes avec des annotations spéciales (par ex.@Searchable), enregistrez vos classes et laissez Compass les indexer au démarrage de l'application et écouter automatiquement les modifications apportées au modèle.

Lorsqu'il s'agit de chercher, vous disposez du pouvoir de Lucene.Compass vous donne ensuite des instances de vos objets modèles comme résultat de recherche.

Ce n'est pas PHP, mais vous avez dit que ce n'était pas nécessairement PHP ;) Je ne sais pas si cela aide, cependant...

Autres conseils

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 save() pour ressembler à ceci :

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

    return parent::save($conn);
}

Cela prend soin de tout garder indexé.En ce qui concerne la recherche, je suggère de créer une classe Search 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;
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top