2016-04-29 9 views
2

私はsunspot gemを使って自分のレールアプリに検索を追加しています。id、amount、またはdescriptionでトランザクションを検索したいと考えています。単一の属性による検索はうまくいきますが、複数のwithまたはfulltext呼び出しを検索ブロックに追加すると、結果が返されません。 withコールをany_ofブロックにラップできますが、fulltextを含むと、undefined method 'fulltext' for #<Sunspot::DSL::Scope:0x007fb6519c13a0>エラーが発生します。sunspotを使用して同じモデルの異なるタイプの複数のフィールドを検索する

検索では、1つの属性のみを検索すると正しい結果が返されます。つまり、any_ofブロックに1つのフルテキストまたは1つのフルテキストしかないことを意味します。だから、私はid、amount、descriptionを無条件で検索します。意味213 213のトランザクションがある場合、213を検索するとid 213のトランザクションが返されます。$ 4.25を検索すると、結果は$ 4.25という額のすべてのトランザクションを返します。私が「Starbucks」を検索した場合、「Starbucks」との取引はすべて明細書に記載されています。もし私がanyblockの中に複数の、または全文を持っていれば、返される結果は得られません。

私には何が欠けていますか?

私はそうのようなトランザクションモデルを持っている:

class Transaction < ActiveRecord::Base 
    ... 

    searchable do 
    text :description 
    integer :id 
    float :amount 
    end 

    ... 
end 

そしてそうのようなコントローラでのアクション:

def search 
    @search = Transaction.search do 
    any_of do 
     with(:amount, params[:search]) 
     with(:id, params[:search]) 
     fulltext(params[:search]) 
    end 
    end 

    @transactions = @search.results 
end 
+0

どのように 'それを壊す'ですか?それはエラーを出すか、結果を返さないか、間違った結果を返しますか?params [:search]の内容を投稿できますか?実際にその検索を含む 'description'フィールドを持つモデルがあることを確認できます – PhilVarg

+0

エラーと詳細を含む質問を更新しました。私は同じモデル上の異なる型の複数のフィールドを検索する方法を知る必要があるので、エラーはおそらく構文的です。私は説明フィールドを持つトランザクションモデルを持っています。 –

答えて

1

は、太陽黒点は、非テキストフィールドを検索するためのものではありません。その他のフィールド型date/integer/etc ..は、全文検索の前に検索範囲を指定するために使用できます。

質問がありましたので、太陽黒点では不可能です。

この例では、floatフィールドamountが全文検索の前にどのようにスコープに使用されているかを見ることができます。

def search 
    @search = Transaction.search do 
    with(:amount).greater_than(params[:amount]) 
    fulltext params[:search] do 
     fields :description 
    end 
    end.results 
end 

テキスト以外の値を検索する場合は、最初にテキスト値に変更する必要があります。あなたがユニークな数値のユーザーIDを持っていた場合など、これが検索にとって貴重な場合がある場合があります。

+0

フルテキストブロックにタイプ文字列ではないフィールドを追加すると、「 'amount' amount '」というトランザクションで設定されたテキストフィールドがありません。 –

+0

申し訳ありませんが、私はあなたが求めていたものを誤解しました。私は私の答えを更新しました。 – bigtunacan

+0

申し訳ありませんが、私は明確に説明しませんでした。スターバックスに$ 5.00の取引があるとします。ユーザーが 'スターバックス'や '5.00'を検索すると、その取引が検索結果に表示されます。これは、太陽黒点がスマートで、params [:search]がテキストや数字であることがわかり、数字を使って量やIDを検索します。 –

0

だからbigtunacanが正しいです。非テキストフィールドを検索することはできません。ドキュメントには、

テキストフィールドがフルテキスト検索可能と表示されています。他のフィールド(例:整数 および文字列)を使用して、クエリの範囲を指定できます。

しかし、この作業を行うには、ブロックをテキストメソッドに渡すことができ、sunspotはブロックの結果にインデックスを付けます。だから私は文字列で検索したいすべてのフィールドを渡します。

だから私は持っている私のトランザクションモデルに:

# we have to create an alias because sunspot uses 'id' for something 
alias_attribute :transaction_id, :id 

searchable do 
    text :transaction do 
    "#{description} #{amount} #{transaction_id}" 
    end 
end 

そして、私が持っている私のトランザクションコントローラで:

def search 
    search = Transaction.search do 
    fulltext(params[:search]) 
    end 

    @transactions = search.results 
end 

だから今は、説明、ID、または量によって検索することができます。

関連する問題