2010-04-11 5 views
7

Est-il possible d'indexer grâce à une association avec Sunspot? Par exemple, si un client a plusieurs contacts, je souhaite qu'un bloc "interrogeable" sur mon modèle client indexe les colonnes Contact # first_name et Contact # last_name pour les recherches sur Customer.Sunspot/Solr recherche plein texte - comment indexer les associations Rails

acts_as_solr a une option: include pour cela. J'ai simplement combiné les noms de colonne associés dans un champ de texte sur le client comme montré ci-dessous, mais cela ne semble pas très flexible.

searchable do 
text :organization_name, :default_boost => 2 
text :billing_address1, :default_boost => 2 
text :contact_names do 
    contacts.map { |contact| contact.to_s } 
end 

Des suggestions?

+0

Savez-vous comment augmenteriez-vous les noms de contact? – chodorowicz

+0

texte: contact_names,: default_boost => 2 – brupm

+0

connexes Question de suivi: Comment les associations ne re-requête: http://stackoverflow.com/questions/12516281/not-re-querying-has-and -belongs-to-many-associations – Anno2001

Répondre

6

C'est exactement comment le faire. Solr est essentiellement orienté document, de sorte que toutes les données provenant d'associations dans votre base de données sont aplaties dans votre document. Une option: inclure est juste du sucre doux qui finit par faire la même chose que vous faites ici.

+0

Intéressant, c'est un peu ce que je pensais. En suivant le même exemple, puis-je trier le jeu de résultats du client par Contact # nom_de_famille d'une manière ou d'une autre? – Sam

+0

Est-ce que l'option: include accélère les choses? THX – brupm

0

Bien sûr:

searchable do 
    string :sort_contact_name do 
    contacts.map { |contact| contact.last_name }.sort.first 
    end 
end 

Ensuite, vous pouvez trier par le: sort_contact_name champ. Notez que j'ai dû réduire l'ensemble des noms de contacts à un seul nom, car Solr ne peut trier que les champs qui ont une seule valeur par document (ce qui est logique quand on y pense).