2012-08-02 81 views
4

鑑於我想找到20個相關結果,我將如何去提升any_of(with(:id).any_of(co_author_ids))中的第一個標準,以便如果有有20個結果與匹配的標準相匹配,而不是根據第二個標準進行匹配?Solr(太陽黑子)查詢時間提升非關鍵字搜索

@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會產生級聯效應,但似乎並不像這樣工作。我知道在關鍵字和全文搜索的基礎上增加查詢時間,但卻無法使用()方法處理它。

+0

你碰巧得到了一個解決方案,因爲這正是我所期待的。 – 2013-07-30 07:45:27

+0

我沒有找到Solr的解決方案。我結束了移動到Elasticsearch搜索和使用恆定分數查詢:http://www.elasticsearch.org/guide/reference/query-dsl/constant-score-query/ – brupm 2013-07-30 16:01:06

+1

耶在這個特殊的情況下solr失敗,但如果你想要在單值索引索引上實現這種級聯效果,那麼可以通過在solr params中使用函數進行排序來完成。如果我的答案中有答案,以防其他人浪費時間用solr實現這一點:) – 2013-07-31 14:46:05

回答

5

因爲co_author_ids是一個多值鍵,我有足夠的理由相信沒有辦法做到這一點。儘管使用單值鍵可以通過使用函數查詢使用solr排序來實現這種級聯效果。 http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function與adjust_solr-PARAMS aong 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 

所以這將排序,如果值的基礎上(author_id_i =#(編號),1,0),作爲回報,將會把所有的記錄與auhtor_id爲相同的用戶在上面。

不知何故,我是越來越使用問題IF函數,所以我代替(practicaaly兩者相同):

@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 [「排序」],但在這種特殊情況下,它不能做(恕我直言),因爲它是多值字段 例如: Using multivalued field in map function Solr function query that operates on count of multivalued field

我想他們可能只是提供了針對多領域包括功能,我們可以只寫 p["sort"] ="if(include(co_authors_ids,#{id}), 1, 0) desc"

但截至目前其不可能(再次恕我直言)