@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) endend
最初我并不认为增强是必要的,因为我认为any_of会产生级联效应,但它看起来并不像那样.我知道在查询关键字和全文搜索时会对查询时间进行提升,但却无法使用with()方法.
解决方法 由于co_author_IDs是一个多值密钥,我有足够的理由相信没有办法实现这一点.虽然使用单值键,但可以通过使用函数查询使用solr排序来实现此级联效果. http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function aong with 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) endend
现在在这种情况下你想要一个级联效果,并希望更多地优先考虑与author_ID完全匹配,你可以这样做
@solr_search = User.solr_search do paginate(:per_page => 20) with(:has_email,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},0)的值进行排序,并且作为回报,将把auhtor_ID的所有记录与用户的顶部相同.
我不知何故使用IF函数遇到问题所以我改为使用(实际上它们都是相同的):
@solr_search = User.solr_search do paginate(:per_page => 20) with(:has_email,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,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" endend
总的来说,我会说你可以用p [“sort”]做很多很酷的事情但是在这种特殊情况下它不能完成(imho)因为它是一个多值字段
例如:
Using multivalued field in map function
Solr function query that operates on count of multivalued field
我希望他们可以为多值字段提供一个包含函数,我们可以写
p [“sort”] =“if(include(co_authors_IDs,#{ID}),0)desc”
但截至目前,这是不可能的(再次imho).
总结以上是内存溢出为你收集整理的ruby-on-rails – 非关键字搜索的Solr(太阳黑子)查询时间提升全部内容,希望文章能够帮你解决ruby-on-rails – 非关键字搜索的Solr(太阳黑子)查询时间提升所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)