2010-04-11 8 views
7

Kann man über eine Assoziation mit Sunspot indexieren? Wenn beispielsweise ein Kunde has_many Contacts hat, möchte ich einen 'durchsuchbaren' Block in meinem Kundenmodell, der die Spalten Kontaktname vorname und Kontaktname nachname für die Suche bei Kunden indiziert.Sunspot/Solr Volltextsuche - wie indiziert man die Rails-Assoziationen

acts_as_solr hat eine Option include. Ich habe einfach die zugehörigen Spaltennamen in ein Textfeld auf Kunde wie unten gezeigt kombiniert, aber das scheint nicht sehr flexibel zu sein.

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 

Irgendwelche Vorschläge?

+0

Wissen Sie, wie würden Sie contact_names steigern? – chodorowicz

+0

Text: contact_names,: default_boost => 2 – brupm

+0

Verwandte Follow-up-Frage: Wie neu Abfrage Assoziationen nicht: http://stackoverflow.com/questions/12516281/not-re-querying-has-and -belongs-to-many-associations – Anno2001

Antwort

6

Das ist genau, wie es geht. Solr ist im Wesentlichen dokumentenorientiert, so dass alle Daten, die von Zuordnungen in Ihrer Datenbank stammen, in Ihrem Dokument abgeflacht sind. Eine: include-Option ist nur milder Zucker, der am Ende dasselbe tut, was Sie hier tun.

+0

Interessant, das ist irgendwie, was ich dachte. Kann ich mit dem gleichen Beispiel das Kundenresultat nach Kontakt # Nachname sortieren? – Sam

+0

Macht die: include-Option die Dinge überhaupt schneller? Danke – brupm

0

Sure:

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

Dann können Sie durch die sortieren: sort_contact_name Feld. Beachten Sie, dass ich die Menge der Kontaktnamen auf einen einzigen Namen reduzieren musste, da Solr nur nach Feldern mit einem einzigen Wert pro Dokument sortieren kann (was sinnvoll ist, wenn Sie darüber nachdenken).