由于 co_author_ids 是一个多值键,我有足够的理由相信没有办法实现这一点。尽管使用单值键可以通过使用函数查询的 solr 排序来实现这种级联效果。http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function aong with the 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"] 做很多很酷的事情,但在这种特殊情况下,它不能完成(恕我直言),因为它是一个多值字段,例如:
在地图函数中使用多值字段
Solr 函数查询基于多值字段的计数
我希望他们可以为多值字段提供一个包含函数,我们可以写
p["sort"] ="if(include(co_authors_ids,#{id}), 1, 0) desc"
但到目前为止,这是不可能的(再次恕我直言)。