2010-04-11 1 views
7

Можно ли индексировать связь с Sunspot?Sunspot/Solr полнотекстовый поиск - как индексировать ассоциации рельсов

Например, если у Клиента есть_имя контактов, я хочу, чтобы в моей модели клиента был найден «доступный для поиска» блок, который индексирует столбцы Contact # first_name и Contact # last_name для использования в поисках в Customer.

actions_as_solr имеет: включить вариант для этого. Я просто сочетал имена связанных столбцов с текстовым полем на клиенте, как показано ниже, но это не кажется очень гибким.

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 

Любые предложения?

+0

Знаете ли вы, как бы вы увеличили контактные имена? – chodorowicz

+0

текст: contact_names,: default_boost => 2 – brupm

+0

Связанные последующий вопрос: Как повторно не запрос ассоциации: http://stackoverflow.com/questions/12516281/not-re-querying-has-and -belongs-to-many-association – Anno2001

ответ

6

Это точно, как это сделать. Solr, по сути, ориентирован на документ, поэтому любые данные, которые поступают из ассоциаций в вашей базе данных, сглажены в ваш документ. Вариант: include - это просто мягкий сахар, который заканчивается тем же, что и вы здесь.

+0

Интересно, вот что я подумал. Идя в том же примере, могу ли я каким-то образом отсортировать набор результатов клиента по контакту # last_name? – Sam

+0

Включает ли параметр: включить скорость? Спасибо – brupm

0

Sure:

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

Затем вы можете отсортировать по: sort_contact_name поле. Обратите внимание, что мне пришлось свести набор имен контактов к одному имени, так как Solr может сортировать только поля, которые имеют одно значение для каждого документа (что имеет смысл, когда вы об этом думаете).