поскольку co_author_ids является многозначным ключом, у меня достаточно причин полагать, что этого добиться невозможно. хотя с ключами с одним значением можно добиться этого каскадного эффекта, используя сортировку solr с использованием функционального запроса. http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function вместе с Adjust_solr-params http://sunspot.github.io/docs/Sunspot/DSL/Adjustable.html
Пример: предположим, что у вас есть такой запрос:
@solr_search = User.solr_search do
paginate(:per_page => 20)
with(:has_email, true)
any_of do
with(:id,author_id) #assuming author id is a solr index
with(:hospitals_id).any_of(hopital_ids)
end
end
и теперь в этом случае вы хотите иметь каскадный эффект и хотите отдать предпочтение точным совпадениям с author_id, вы можете сделать это так
@solr_search = User.solr_search do
paginate(:per_page => 20)
with(:has_email, true)
any_of do
with(:id,author_id) #assuming author id is a solr index
with(:hospitals_id).any_of(hopital_ids)
end
adjust_solr_params do |p|
p["sort"] = "if(author_id_i = #{id},1,0) desc" #note author_id_i solr eq of author_id
end
end
так что это будет сортироваться на основе значения if(author_id_i = #{id},1,0) и, в свою очередь, поместит все записи с auhtor_id так же, как у пользователя сверху.
у меня почему-то возникли проблемы с использованием функции IF, поэтому я вместо этого использовал (практически оба они одинаковы):
@solr_search = User.solr_search do
paginate(:per_page => 20)
with(:has_email, true)
any_of do
with(:id,author_id) #assuming author id is a solr index
with(:hospitals_id).any_of(hopital_ids)
end
adjust_solr_params do |p|
p[:sort] = "min(abs(sub(author_id_i,#{id})),1) asc"
end
end
я наткнулся на это также http://wiki.apache.org/solr/SpatialSearch при поиске для решения этого, и если вы хотите отсортировать по расстоянию, вы можете сделать что-то вроде:
@solr_search = User.solr_search do
paginate(:per_page => 20)
with(:has_email, true)
any_of do
with(:id,author_id) #assuming author id is a solr index
with(:hospitals_id).any_of(hopital_ids)
end
adjust_solr_params do |p|
p[:pt] = "#{latitude_of_your_interest},#{longitude_of_your_interest}"
p[:sfield] = :author_location #your solr index which stores location of the author
p[:sort] = "geodist() asc"
end
end
в целом я бы сказал, что вы можете делать много интересных вещей с p["sort"] но в данном конкретном случае это невозможно (imho), потому что это многозначное поле, например: Использование многозначного поля в функции карты Запрос функции Solr, который работает с количеством многозначных полей
Я бы хотел, чтобы они просто предоставили функцию включения для многозначного поля, и мы могли бы просто написать p["sort"] ="if(include(co_authors_ids,#{id}), 1, 0) desc"
но на данный момент это невозможно (опять же имхо).
person
Sahil Dhankhar
schedule
31.07.2013