4

鉴于我想找到 20 个相关结果,我将如何提升 any_of (with(:id).any_of(co_author_ids)) 中的第一个标准,以便如果有 20 个结果符合所述标准,它将返回而不是尝试根据第二个标准匹配?

@solr_search = User.solr_search do
  paginate(:per_page => 20)
  with(:has_email, true)

  any_of do      
    with(:id).any_of(co_author_ids)        
    with(:hospitals_id).any_of(hopital_ids)
  end
end

最初我不认为提升是必要的,因为我认为 any_of 会产生级联效应,但它似乎不像那样工作。我知道谁来提高关键字和全文搜索的查询时间,但无法使用 with() 方法。

4

1 回答 1

5

由于 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"

但到目前为止,这是不可能的(再次恕我直言)。

于 2013-07-31T14:40:57.790 回答