2011-07-20 11 views
0

私は次のモデルを持っており、sunspot_railsで検索可能としたとします。レールにモデルIDで検索結果を注文するSunspot Rails?

class Case < ActiveRecord::Base 
    searchable do 
    end 
end 

太陽黒点の標準schema.xmlは、インデックスフィールドとしてid宣言する。

Case 15細かい作品を返す結果に等しい idCasesを検索
http://localhost:8982/solr/select/?q=id%3A%22Case+15%22&version=2.2&start=0&rows=10&indent=on 

:私はSolrのとテストにアクセスするためのWebインターフェイスを使用するときのようなクエリを照会します。

私はレールコンソールで太陽黒点のRailsで検索を実行するときに問題がある:

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

私が手:

それは正しく :qで正しいクエリ値を置くことを示して
=> <Sunspot::Search:{:fl=>"* score", :rows=>10, :start=>0, :q="id:\"Case 15\"", :defType=>"dismax", :fq=>["type:Case"]}> 

ヒット数は0です:

s.hits 

返信

=> [] 

我々はkeywordsコロン:前に定義されたフィールド等価ではないとだけtextフィールド(全文検索)を検索していないと仮定した場合、私は次のことを試すことができます。

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

これは太陽黒点の例外で失敗します。私は、インデックス付きの標準的なSolrの/黒点idフィールドを使って検索することができますどのように

Sunspot::UnrecognizedFieldError: No field configured for Case with name '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は、Sunspotの内部フィールドであり、直接使用しないでください。

独自の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

私はこの質問を投稿して以来、長い間、 orkaroundは、自分のidフィールドを追加するための最初の提案に似ています。しかし、それは別のインデックス可能なフィールド "id_i"を作成するため、 'class Case

+0

あなたの質問はどちらも私の回答で答えられます:) 1.なぜか:なぜなら、それはSunspotによって使用される内部フィールドなので、カプセル化の原則を破るので、それを使用したり仮定したりしてはいけません(また、バージョンの黒点、その意味またはその実装は完全に変更することができます)2.本当にそれを使用したい場合は、私の答えの最後の部分を見てください。 –

+0

私は確かあなたの記事が役に立つと感じました。 – vise

関連する問題