2009-09-24 5 views
1

J'ai quelques besoins spécifiques pour ma recherche et je suis intéressé à obtenir l'opinion des gens sur ce que l'approche de recherche a le plus de sens. Basé sur mon explication ci-dessous, recommanderiez-vous que j'utilise des requêtes SQL de base? Ou passer à une solution de recherche plus avancée, comme Sphinx?Rails - Que dois-je utiliser pour la recherche?

J'ai deux modèles que je recherche: les produits et les variétés.

produit has_many :varieties
variété belongs_to :product

J'ai besoin ma recherche de reconnaître la relation entre les produits et les variétés. Cependant, les variétés n'ont pas leur propre existence sur le site. Ainsi, lorsqu'un utilisateur recherche une variété dans le système, j'ai besoin de la recherche pour retourner la page de produit correspondante sur laquelle réside la variété. Par exemple, disons que le produit est une balle et que la variété est rebondissante. Si un utilisateur recherche "bouncy", je veux que la recherche retourne la vue balle/spectacle.

L'autre tweak implique les résultats. S'il n'y a qu'un résultat pour une recherche donnée, je veux afficher la page produit/spectacle. Cependant, s'il y a plusieurs résultats, je veux afficher la page produit/index, affichant les résultats multiples. Mon jeu de données est un univers assez limité, donc je pense qu'il sera assez commun que nous ayons un seul résultat.

Ce sont mes exigences. Puis-je satisfaire à ces exigences avec des requêtes et des conditions SQL standard? Ou recommanderiez-vous une approche de recherche plus avancée?

Merci!

Répondre

4

L'une ou l'autre solution répondra à vos besoins, mais vous pouvez la satisfaire avec des requêtes SQL standard uniquement si votre jeu de données est petit. Dans ce cas, un index DB sur les requêtes recherchées est important. Vous pouvez jeter un oeil à scoped_search que j'ai utilisé pour de petits projets et faire le travail.

Si vous avez un grand ensemble de données et que les requêtes SQL simples vous ralentissent, sphinx (et thinking-sphinx) est le chemin à parcourir. Le seul inconvénient de cette approche est de devoir surveiller et maintenir un autre démon, bien qu'il soit très stable et léger. Cette solution est également très facile à mettre en œuvre, et il existe une bonne communauté autour de think-sphinx. Enfin, vous pouvez considérer les capacités de recherche de texte intégral de votre base de données. Si vous utilisez PostgreSQL, tsearch est une excellente solution car elle est très rapide et intégrée dans votre processus de base de données. Il y a quelques plugins Rails pour interagir avec lui: acts-as-tsearch et tsearchable. Essayez-les et voyez lequel vous convient le mieux.

+0

Merci. Juste mis en application scoped_search et c'était rapide et facile. Des suggestions sur la façon de mettre en œuvre la logique de résultats que je veux atteindre? Si seulement un résultat -> produit/spectacle. Si multiple -> produit/index. Je pense que je peux ajouter un langage conditionnel au contrôleur de produit, mais je ne sais pas exactement comment le faire. – MikeH

+0

Dans votre action d'index sur votre productions_controller: redirect_to: action => 'show' if @ products.length == 1 – hgmnz

+0

Merci. Quand j'ai essayé cela, j'ai ceci: Impossible de trouver le produit avec ID = show. L'application essaie de m'envoyer à l'url:/products/show, au lieu de produits/id – MikeH

Questions connexes