2010-04-11 19 views
7

Czy możliwe jest indeksowanie poprzez powiązanie z Sunspot?Sunspot/Solr wyszukiwanie pełnotekstowe - jak zindeksować powiązania Railsów

Na przykład, jeśli klient ma wiele kontaktów, chcę mieć blok "do przeszukiwania" w moim modelu klienta, który indeksuje kolumny Contact # first_name i Contact # last_name używane w wyszukiwaniu na kliencie.

acts_as_solr ma opcję: include for this. Po prostu łączę skojarzone nazwy kolumn w polu tekstowym na kliencie, jak pokazano poniżej, ale nie wydaje się to zbyt elastyczne.

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 

Wszelkie sugestie?

+0

Czy wiesz, jak poprawić nazwy kontaktowe? – chodorowicz

+0

tekstowe: contact_names,: default_boost => 2 – brupm

+0

pokrewne kolejne pytanie: stowarzyszenia Jak nie ponownie zapytań: http://stackoverflow.com/questions/12516281/not-re-querying-has-and -belongs-to-many-association – Anno2001

Odpowiedz

6

Dokładnie to zrobić. Solr jest zasadniczo zorientowany na dokumenty, więc wszelkie dane pochodzące ze skojarzeń w bazie danych są spłaszczane w dokumencie. Opcja: include to po prostu łagodny cukier, który kończy się robieniem tego samego, co tutaj.

+0

Interesujące, to coś, co myślałem. Idąc z tym samym przykładem, mogę w jakiś sposób posortować zestaw wyników klienta według Contact # last_name? – Sam

+0

Czy opcja: include przyspiesza działanie? Dzięki – brupm

0

Sure:

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

Następnie można sortować według: sort_contact_name pola. Zauważ, że musiałem zredukować zestaw nazw kontaktów do jednej nazwy, ponieważ Solr może sortować tylko na polach, które mają pojedynczą wartość na jeden dokument (co ma sens, gdy się nad tym zastanowić).

Powiązane problemy