2015-12-18 4 views
1

Примечание: Я использую Sunspot с Rails, но общий ответ Solr может по-прежнему направлять меня в правильном направлении, если вы не знакомы с DSL Sunspot.Как повысить результаты поиска Solr по типу документа?

У меня есть несколько моделей, подобные этим:

class Book < ActiveRecord::Base 
    searchable do 
    text :title, boost: 2.0 
    text :content 
    end 
end 

class Article < ActiveRecord::Base 
    searchable do 
    text :title, boost: 2.0 
    text :content 
    end 
end 

Я Нуждаясь сделать полнотекстовый поиск во всех моделях, в то же время для смешанного результата, но статьи следует рассматривать немного более актуальной чем книги в результатах поиска.

Мой текущий код для выполнения поиска выглядит следующим образом.

search = Sunspot.search do 
    fulltext search_terms, minimum_match: 1 
end 

Это правильно возвращает смешанные результаты, но мне нужно, чтобы результаты Статьи были увеличены по сравнению с результатами Книги. Я хочу быть ясно, что это НЕ то же самое, что перечислять все результаты статьи сначала, а затем перечислять все результаты книги. Там может быть некоторое сочетание в зависимости от того, как Solr оценивает результаты на основе их общего содержания.

Я предполагаю, что мне нужно будет использовать некоторую функцию повышения, но не могу точно определить, как именно.

Любые указатели?

ответ

1

Sunspot обычно пытается выявить такие вещи как функции в блоке «поиска». Проверка Sunspot docs показывает это ...

# Posts with pizza, scored higher if featured 
Post.search do 
    fulltext 'pizza' do 
    boost(2.0) { with(:featured, true) } 
    end 
end 

Это из https://sunspot.github.io/docs/#Search_In_Depth

Поскольку Sunspot индексы название модели в поле «тип», я думаю, вы могли бы адаптировать, что таким образом:

boost(10.0) { with(:type, "Article") } 

Увы. Если вы попробуете это, вы получите сообщение об ошибке, как это:

Sunspot::UnrecognizedFieldError: No field configured for Article, Book with name 'type' 

Это потому, что текущие версии DSL SunSpot в данном случае ссылки на поля определены в searchable блоке, в то время как type поля является своеобразным особый случай. Возможно, хорошая возможность для участия в Sunspot?

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

ведущего меня к этому последнему примеру коды (непроверенные, YMMV, и т.д.!)

class Article < ActiveRecord::Base 
    searchable do 
    text :title, boost: 2.0 
    text :content 
    string :source do 
     class.name 
    end 
    end 
end 

Sunspot.search(Article, Book) do 
    fulltext(search_terms) do 
    minimum_match 1 
    boost(ARTICLE_BOOST) { where(source, "Article") } 
    end 
end