2011-07-20 73 views
0

假設我有以下模型,並使其可以通過sunspot_rails進行搜索。Sunspot Rails通過型號id來訂購搜索結果?

class Case < ActiveRecord::Base 
    searchable do 
    end 
end 

太陽黑子的標準schema.xml Rails中聲明id作爲索引字段。當我使用Web界面訪問和Solr的測試查詢類似的查詢:

http://localhost:8982/solr/select/?q=id%3A%22Case+15%22&version=2.2&start=0&rows=10&indent=on 

其搜索Casesid等於Case 15工作正常,並返回結果。

問題是,當我執行在軌控制檯與太陽黑子的Rails搜索:

s = Case.search do 
    keywords('id:"Case 15"') 
end 

我得到:

=> <Sunspot::Search:{:fl=>"* score", :rows=>10, :start=>0, :q="id:\"Case 15\"", :defType=>"dismax", :fq=>["type:Case"]}> 

這表明,正確地放入:q正確的查詢值,但是命中0:

s.hits 

回報

=> [] 

如果我們假設keywords不等同,只有搜索text場(全文搜索),而不是該領域的冒號:之前定義的話,我可以嘗試以下方法:

s = Case.search do 
    with(:id, "Case 15") 
end 

但這種失敗,太陽黑子異常:

Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id' 

如何搜索使用索引標準的Solr /太陽黑子id場我的模型?

爲了讓這個問題更加有用,我怎樣才能通過id命令。以下不起作用:

s = Case.search do 
    keywords("xxxx") 
    order_by :id, :desc 
end 

不起作用。 Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id'

回答

4

你說的ID是太陽黑子內部字段,不應該直接使用。

爲什麼不能加入你自己的ID字段(更改變量名稱,以避免名稱衝突):

class Case < ActiveRecord::Base 
    searchable do 
    integer :model_id {|content| content.id } 
    end 
end 

然後

s = Case.search do 
    keywords("xxxx") 
    order_by :model_id, :desc 
end 

其他(亂),選擇是直接solr params破解:

s = Case.search do 
    keywords("xxxx") 
    adjust_solr_params(:sort, 'id desc') 
end 
+0

既然我發佈這個問題已經很長時間了,與此同時,我已經實現了aw orkaround,類似於你的第一個建議添加我自己的id字段。但它是'id'我添加如下:'class Case

+0

你的問題在我的回答中得到了回答:) 1.爲什麼不這樣做:因爲它是太陽黑子使用的內部場所,所以你不應該使用它或者對它做出假設,因爲它會破壞封裝原則(另外,太陽黑子的版本,其含義或其實現可以完全改變)2.如果你真的想使用它,看看我的答案的最後一部分。 –

+0

我當然發現你的帖子很有用。 – vise